db.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. '''
  2. Convenient access to various databases
  3. '''
  4. from pypyodbc import Connection
  5. class CustomDb(Connection):
  6. """ Connexion to a database """
  7. _cache = {}
  8. default_name = ""
  9. drivername = ""
  10. dsn = ""
  11. default_user = ""
  12. default_pwd = ""
  13. def __init__(self, **kwargs):
  14. cls = self.__class__
  15. if not "uid" in kwargs and cls.default_user:
  16. kwargs["uid"] = cls.default_user
  17. if not "pwd" in kwargs and cls.default_pwd:
  18. kwargs["pwd"] = cls.default_pwd
  19. super(CustomDb, self).__init__(cls.dsn, **kwargs)
  20. def connect(self, *args, **kwargs):
  21. """ Establish the connexion to the database"""
  22. super(CustomDb, self).connect(*args, **kwargs)
  23. def read(self, sql, *args):
  24. """ yield rows as NamedTupleRow """
  25. cursor = self.execute(sql)
  26. row = cursor.fetchone()
  27. while row:
  28. yield row
  29. row = cursor.fetchone()
  30. cursor.close()
  31. def read_all(self, sql, *args):
  32. """ return the selection as a list of dictionnaries """
  33. cursor = self.execute(sql)
  34. data = [dict(zip([column[0] for column in cursor.description], row)) for row in cursor.fetchall()]
  35. cursor.close()
  36. return data
  37. def execute(self, sql, *args):
  38. cursor = self.cursor()
  39. args = [sql, tuple(args)] if args else [sql]
  40. cursor.execute(*args)
  41. return cursor
  42. class AccessDb(CustomDb):
  43. dsn = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};"
  44. default_user = "admin"
  45. default_pwd = ""
  46. def __init__(self, dbpath, **kwargs):
  47. super(AccessDb, self).__init__(dbq=dbpath, **kwargs)
  48. def assert_connected(self):
  49. for row in self.read("SELECT TOP 1 * FROM MSysObjects;"):
  50. if not row:
  51. raise AssertionError("Unable to connect to: {}".format(self.connectString))
  52. return
  53. class AccessSDb(AccessDb):
  54. dsn = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};"
  55. default_user = ""
  56. default_pwd = ""
  57. def __init__(self, dbpath, mdwpath, uid, pwd, **kwargs):
  58. super(AccessSDb, self).__init__(dbpath, uid=uid, pwd=pwd, systemdb=mdwpath, **kwargs)
  59. class OracleDb(CustomDb):
  60. dsn = "DRIVER={Oracle dans ORA102};"
  61. def __init__(self, dbname, user, pwd, **kwargs):
  62. super(OracleDb, self).__init__(dbq=dbname, uid=user, pwd=pwd, **kwargs)
  63. class SqlServerDb(CustomDb):
  64. dsn = "DRIVER={SQL Server};"
  65. def __init__(self, server, dbname, user, pwd, **kwargs):
  66. super(SqlServerDb, self).__init__(server=server, database=dbname, uid=user, pwd=pwd, **kwargs)
  67. # class SqliteDb(CustomDb):
  68. # drivername = "QODBC"
  69. # dsn = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};FIL={{MS Access}}"
  70. # default_user = "admin"
  71. # pwd = ""
  72. # def __init__(self, dbpath, **kwargs):
  73. # CustomDb.__init__(self, dbq=dbpath, **kwargs)
  74. #
  75. # class PostgresDb(CustomDb):
  76. # drivername = "QODBC"
  77. # dsn = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};FIL={{MS Access}}"
  78. # default_user = "admin"
  79. # pwd = ""
  80. # def __init__(self, dbpath, **kwargs):
  81. # CustomDb.__init__(self, dbq=dbpath, **kwargs)