gpt4 book ai didi

python - 在SQLAlchemy中使用装饰器创建引擎

转载 作者:行者123 更新时间:2023-12-01 01:06:03 27 4
gpt4 key购买 nike

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

+----------+
| Database |
+----------+
| DB1 |
| DB2 |
| DB3 |
| DB4 |
+----------+

它们都有结构:

+----------------+
| Tables_in_DB_N |
+----------------+
| table_1 |
| table_2 |
| table_3 |
+----------------+

因此,我想到了使用装饰器来创建引擎和 Session 类:

Session = None
def decor(func, user=USERNAME, passw=PASSWORD, host=HOSTNAME, port=POST, 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))
global Session
Session = sessionmaker(bind=engine)
return func(*args, **kwargs)
return wrapper
return real_decor

以及使用此装饰器示例的函数:

@decor(db='DB1')
def get_db1_table1_values():
session = Session()
values = session.query(Table1).all()
session.close()
return values

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

最佳答案

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

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

使用此装饰器,它将 session 直接注入(inject)到调用函数中,并避免使用 global 关键字。这样做需要像这样定义数据库访问函数:

@another_decor(db='three')
def get_three_table1_values(session):
session = session()
query = session.query(Table1).all()
session.close()
return query

根据 SQLAlchemy 管理其数据库连接的方式,使用其自己的 EngineSession 来装饰每个数据库访问函数,很容易耗尽与数据库的连接。

MySQL 通常在内存中运行并基于 SQLAlchemys documentation我认为它将汇集连接。所以这个用法可能没问题。

关于python - 在SQLAlchemy中使用装饰器创建引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55347383/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com