Python 如何全局初始化SQL炼金术引擎、会话和表

Python 如何全局初始化SQL炼金术引擎、会话和表,python,mysql,sqlalchemy,Python,Mysql,Sqlalchemy,我正在开发一个python应用程序,它的大部分功能将与MySQL数据库中的特定表进行交互(创建、读取、更新和删除)。我知道我可以使用以下代码查询此特定表: engine = create_engine( f"mysql+pymysql://{username}:{password}@{host}:{port}", pool_pre_ping=True ) meta = MetaData(engine) my_ta

我正在开发一个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中定义这些内容,然后将它们作为函数参数传递吗?我应该定义一个大类并在类初始化期间初始化它们吗

我的目标是能够在任何时候在任何函数中查询该表,而不必担心连接是否消失。根据报告:

只有一次,在应用程序的全局范围内的某个地方。它应该被视为应用程序配置的一部分。例如,如果应用程序包中有三个.py文件,可以将sessionmaker行放在init.py文件中;从那时起,在其他模块上说“从mypackage导入会话”。这样,其他所有人都只使用Session(),该会话的配置由该中心点控制


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

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

  • 元数据对象(
    meta
    )不是查询所必需的,但可以作为
    my_表提供。元数据
    (如果需要)
  • 会话不是必需的,因为您似乎没有使用SQLAlchemy ORM
引擎维护一个连接池,您可以签出它来运行查询(不过不要忘记关闭它们)。此示例代码使用上下文管理器确保提交事务并关闭连接:

#检查连接
使用engine.connect()作为连接:
#启动交易
使用conn.begin():
q=选择(我的表格)。其中(我的表格c.id>=1)
结果=连接执行(q)

如果您使用的是单个
实例,那么该实例(
my_Table
)和引擎应该足够全局可用。您只使用
meta
来设置表,而没有使用ORM,因此没有太多的会话意义。好的,但是表的实例是否需要连接生命周期?或者定义后,它只管理自己的数据库连接池?谢谢!我最终使用了类似的解决方案。我想我只需要使用SQL Alchemy核心函数。