db.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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. class AccessSDb(AccessDb):
  49. dsn = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};"
  50. default_user = ""
  51. default_pwd = ""
  52. def __init__(self, dbpath, mdwpath, uid, pwd, **kwargs):
  53. super(AccessSDb, self).__init__(dbpath, uid=uid, pwd=pwd, systemdb=mdwpath, **kwargs)
  54. class OracleDb(CustomDb):
  55. dsn = "DRIVER={Oracle dans ORA102};"
  56. def __init__(self, dbname, user, pwd, **kwargs):
  57. super(OracleDb, self).__init__(dbq=dbname, uid=user, pwd=pwd, **kwargs)
  58. class SqlServerDb(CustomDb):
  59. dsn = "DRIVER={SQL Server};"
  60. def __init__(self, server, dbname, user, pwd, **kwargs):
  61. super(SqlServerDb, self).__init__(server=server, database=dbname, uid=user, pwd=pwd, **kwargs)
  62. # class SqliteDb(CustomDb):
  63. # drivername = "QODBC"
  64. # dsn = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};FIL={{MS Access}}"
  65. # default_user = "admin"
  66. # pwd = ""
  67. # def __init__(self, dbpath, **kwargs):
  68. # CustomDb.__init__(self, dbq=dbpath, **kwargs)
  69. #
  70. # class PostgresDb(CustomDb):
  71. # drivername = "QODBC"
  72. # dsn = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};FIL={{MS Access}}"
  73. # default_user = "admin"
  74. # pwd = ""
  75. # def __init__(self, dbpath, **kwargs):
  76. # CustomDb.__init__(self, dbq=dbpath, **kwargs)