【问题标题】:How to initialize SQL Alchemy engine, session and table globally如何全局初始化 SQL Alchemy 引擎、会话和表
【发布时间】: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(),并且该会话的配置由该中心点控制。

好的,但是enginetablemeta 呢?我需要担心这些吗?

【问题讨论】:

  • 如果您正在使用单个 Table 实例,那么该实例 (my_table) 和引擎应该足以在全球范围内使用。您只是使用meta 来设置表,并且您没有使用 ORM,因此进行会话没有多大意义。
  • 好的,但是那个表实例需要连接生命周期吗?或者一旦定义它只是管理自己的数据库连接池?

标签: python mysql sqlalchemy


【解决方案1】:

如果您使用的是单个表,那么反射表实例 (my_table) 和引擎应该是您需要全局公开的全部内容。

  • 查询不需要的元数据对象 (meta),但如果需要,可以作为 my_table.metadata 使用
  • 不需要会话,因为您似乎没有使用 SQLAlchemy ORM。

引擎维护着一个连接池,您可以签出这些连接池以运行查询(不过不要忘记关闭它们)。此示例代码使用上下文管理器来确保提交事务并关闭连接:

# Check out a connection
with engine.connect() as conn:
    # Start a transaction
    with conn.begin():
        q = select(my_table).where(my_table.c.id >= 1)
        result = conn.execute(q) 

【讨论】:

  • 谢谢!我最终使用了类似的解决方案。我想我只需要使用 SQL Alchemy 核心函数。
猜你喜欢
  • 2015-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 2016-12-16
  • 2014-03-31
  • 1970-01-01
相关资源
最近更新 更多