Python 使用decorator在SQLAlchemy中创建引擎

Python 使用decorator在SQLAlchemy中创建引擎,python,sqlalchemy,Python,Sqlalchemy,我的MySQL服务器上有几个DB实例,我想创建一个小型库来使用它们。所有数据库都具有相同的结构-具有相同列的相同表。我使用SQLAlchemy来处理这个DBs,但我不能使用一个引擎同时建立到多个DBs的连接。那么,让我们举一个例子: +----------+ |数据库| +----------+ |DB1| |DB2| |DB3| |DB4| +----------+ 它们都有结构: +----------------+ |数据库中的表格| +----------------+ |表1| |表

我的MySQL服务器上有几个DB实例,我想创建一个小型库来使用它们。所有数据库都具有相同的结构-具有相同列的相同表。我使用SQLAlchemy来处理这个DBs,但我不能使用一个引擎同时建立到多个DBs的连接。那么,让我们举一个例子:

+----------+
|数据库|
+----------+
|DB1|
|DB2|
|DB3|
|DB4|
+----------+
它们都有结构:

+----------------+
|数据库中的表格|
+----------------+
|表1|
|表2|
|表3|
+----------------+
因此,我想到了一个使用装饰器来创建引擎和
会话
类的想法:

Session=None
def decor(func,user=USERNAME,passw=PASSWORD,host=HOSTNAME,port=POST,db=db):
def真实装饰(功能):
def包装(*args,**kwargs):
engine=create_engine('mysql+mysqlconnector://{user}:{passw}@{host}:{port}/{db}'。格式(user=user,passw=passw,host=host,port=port,db=db))
全球会议
会话=会话生成器(绑定=引擎)
返回函数(*args,**kwargs)
返回包装器
返回真实装饰
和函数使用此装饰器示例:

@decor(db='DB1')
def get_db1_表1_值():
会话=会话()
values=session.query(表1).all()
session.close()
返回值

这个解决方案有效。我真的不喜欢使用
全局会话
。。。那么,还有其他方法可以实现此功能吗?

这是一个有趣的问题,如果不了解应用程序的生命周期,很难找到适合您的用例的解决方案,但这里有一个尝试:

def another_decor(user=USERNAME, passw=PASSWORD, host=HOSTNAME, port=PORT, db=DB):
    def real_decor(func):
        def wrapper(*args, **kwargs):
            engine = create_engine('mysql+mysqlconnector://{user}:{passw}@{host}:{port}/{db}'.format(user=user, passw=passw, host=host, port=port, db=db))
            session = sessionmaker(bind=engine)
            return func(session, *args, **kwargs)
        return wrapper
    return real_decor
使用此装饰器,它将会话直接注入调用函数,并避免使用
global
关键字。执行此操作需要如下定义数据库访问函数:

@another_decor(db='three')
def get_three_table1_values(session):
    session = session()
    query = session.query(Table1).all()
    session.close()
    return query
根据SQLAlchemy管理其数据库连接的方式,使用自己的
引擎和
会话来装饰每个数据库访问函数很容易耗尽您与数据库的连接


MySQL通常在内存中运行,我认为它将基于池连接。因此,这种用法可能还可以。

引擎保留池。一个应用程序通常每个数据库只有一个引擎。