''' Convenient access to various databases ''' from pypyodbc import Connection class CustomDb(Connection): """ Connexion to a database """ _cache = {} default_name = "" drivername = "" dsn = "" default_user = "" default_pwd = "" def __init__(self, **kwargs): cls = self.__class__ if not "uid" in kwargs and cls.default_user: kwargs["uid"] = cls.default_user if not "pwd" in kwargs and cls.default_pwd: kwargs["pwd"] = cls.default_pwd super(CustomDb, self).__init__(cls.dsn, **kwargs) def connect(self, *args, **kwargs): """ Establish the connexion to the database""" super(CustomDb, self).connect(*args, **kwargs) def read(self, sql, *args): """ yield rows as NamedTupleRow """ cursor = self.execute(sql) row = cursor.fetchone() while row: yield row row = cursor.fetchone() cursor.close() def read_all(self, sql, *args): """ return the selection as a list of dictionnaries """ cursor = self.execute(sql) data = [dict(zip([column[0] for column in cursor.description], row)) for row in cursor.fetchall()] cursor.close() return data def execute(self, sql, *args): cursor = self.cursor() args = [sql, tuple(args)] if args else [sql] cursor.execute(*args) return cursor class AccessDb(CustomDb): dsn = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};" default_user = "admin" default_pwd = "" def __init__(self, dbpath, **kwargs): super(AccessDb, self).__init__(dbq=dbpath, **kwargs) class AccessSDb(AccessDb): dsn = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};FIL={MS Access};" default_user = "" default_pwd = "" def __init__(self, dbpath, mdwpath, uid, pwd, **kwargs): super(AccessSDb, self).__init__(dbpath, uid=uid, pwd=pwd, systemdb=mdwpath, **kwargs) class OracleDb(CustomDb): dsn = "DRIVER={Oracle dans ORA102};" def __init__(self, dbname, user, pwd, **kwargs): super(OracleDb, self).__init__(dbq=dbname, uid=user, pwd=pwd, **kwargs) class SqlServerDb(CustomDb): dsn = "DRIVER={SQL Server};" def __init__(self, server, dbname, user, pwd, **kwargs): super(SqlServerDb, self).__init__(server=server, database=dbname, uid=user, pwd=pwd, **kwargs) # class SqliteDb(CustomDb): # drivername = "QODBC" # dsn = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};FIL={{MS Access}}" # default_user = "admin" # pwd = "" # def __init__(self, dbpath, **kwargs): # CustomDb.__init__(self, dbq=dbpath, **kwargs) # # class PostgresDb(CustomDb): # drivername = "QODBC" # dsn = "DRIVER={{Microsoft Access Driver (*.mdb, *.accdb)}};FIL={{MS Access}}" # default_user = "admin" # pwd = "" # def __init__(self, dbpath, **kwargs): # CustomDb.__init__(self, dbq=dbpath, **kwargs)