我正在开发一个python应用程序,它的大部分功能都将与MySQL数据库中的一个特定表进行交互(创建、读取、更新和删除)。我知道我可以用下面的代码查询这个特定表:
engine = create_engine(
f"mysql+pymysql://{username}:{password}@{host}:{port}",
pool_pre_ping=True
)
meta = MetaData(engine)
my_table = Table(
'my_table',
meta,
autoload=True,
schema=db_name
)
dbsession = sessionmaker(bind=engine)
session = dbsession()
# example query to table
results = session.query(my_table).filter(my_table.columns.id >=1)
results.all()
字符串
然而,我不知道如何使这些定义(引擎、Meta、表、会话)对我的所有函数都是全局的。我是否应该在我的init.py中定义这些内容,然后将它们作为函数参数沿着?我是否应该定义一个大类,并在类初始化期间初始化它们?
我的目标是能够在任何时候在我的任何函数中查询该表,而不必担心连接是否已经断开。
在应用程序的全局作用域中只需要一次。它应该被看作是应用程序配置的一部分。例如,如果应用程序在一个包中有三个.py文件,你可以将sessionmaker行放在init.py文件中;从那时起,你的其他模块就说“从mypackageimport会话”,这样,其他人就只需要使用Session(),并且该会话的配置由该中心点控制。
好的,但是engine
、table
和meta
怎么办?我需要担心这些吗?
1条答案
按热度按时间rlcwz9us1#
如果您使用的是单个表,那么反射表示例(
my_table
)和引擎应该是全局公开所需的全部。meta
),但如果需要,可以作为my_table.metadata
使用引擎维护了一个连接池,你可以 checkout 它来运行查询(但是不要忘记关闭它们)。这个示例代码使用上下文管理器来确保事务被提交并且连接被关闭:
字符串