Python 使用decorator在SQLAlchemy中创建引擎
我的MySQL服务器上有几个DB实例,我想创建一个小型库来使用它们。所有数据库都具有相同的结构-具有相同列的相同表。我使用SQLAlchemy来处理这个DBs,但我不能使用一个引擎同时建立到多个DBs的连接。那么,让我们举一个例子:Python 使用decorator在SQLAlchemy中创建引擎,python,sqlalchemy,Python,Sqlalchemy,我的MySQL服务器上有几个DB实例,我想创建一个小型库来使用它们。所有数据库都具有相同的结构-具有相同列的相同表。我使用SQLAlchemy来处理这个DBs,但我不能使用一个引擎同时建立到多个DBs的连接。那么,让我们举一个例子: +----------+ |数据库| +----------+ |DB1| |DB2| |DB3| |DB4| +----------+ 它们都有结构: +----------------+ |数据库中的表格| +----------------+ |表1| |表
+----------+
|数据库|
+----------+
|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通常在内存中运行,我认为它将基于池连接。因此,这种用法可能还可以。引擎保留池。一个应用程序通常每个数据库只有一个引擎。