【发布时间】:2021-05-18 19:03:15
【问题描述】:
我正在开发一个 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()
但是,我不明白如何使这些定义(引擎、元、表、会话)对我的所有函数都是全局的。我应该在我的 init.py 中定义这些东西,然后将它们作为函数参数传递吗?我应该定义一个大类并在类初始化期间初始化它们吗?
我的目标是能够随时在我的任何函数中查询该表,而不必担心连接是否已断开。根据SQL Alchemy docs:
只需一次,在您的应用程序的全局范围内的某个地方。它应该被视为应用程序配置的一部分。如果您的应用程序在一个包中包含三个 .py 文件,例如,您可以将 sessionmaker 行放在 init.py 文件中;从那时起,在您的其他模块上说“from mypackage import Session”。这样一来,其他所有人都只使用 Session(),并且该会话的配置由该中心点控制。
好的,但是engine、table 和 meta 呢?我需要担心这些吗?
【问题讨论】:
-
如果您正在使用单个
Table实例,那么该实例 (my_table) 和引擎应该足以在全球范围内使用。您只是使用meta来设置表,并且您没有使用 ORM,因此进行会话没有多大意义。 -
好的,但是那个表实例需要连接生命周期吗?或者一旦定义它只是管理自己的数据库连接池?
标签: python mysql sqlalchemy