python 如何全局初始化SQL Alchemy引擎、会话和表

sdnqo3pr  于 2024-01-05  发布在  Python
关注(0)|答案(1)|浏览(121)

我正在开发一个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(),并且该会话的配置由该中心点控制。
好的,但是enginetablemeta怎么办?我需要担心这些吗?

rlcwz9us

rlcwz9us1#

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

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

引擎维护了一个连接池,你可以 checkout 它来运行查询(但是不要忘记关闭它们)。这个示例代码使用上下文管理器来确保事务被提交并且连接被关闭:

# Check out a connection and start a transaction.
with engine.begin() as conn:
    q = select(my_table).where(my_table.c.id >= 1)
    result = conn.execute(q)
    # Transaction committed and connection returned to the pool
    # when we leave the context manager.

字符串

相关问题