cod*_*er5 0 python postgresql sqlalchemy flask-sqlalchemy
我正在开发一个使用 Flask、SQLAlchemy 和 PostgreSQL 的应用程序。我必须编写一个在数据库上执行多个查询的事务。
def exec_query_1():
with db.engine.connect() as connection:
connection.execute(#some-query)
def exec_query_2():
with db.engine.connect() as connection:
connection.execute(#some-query)
def exec_query_3():
with db.engine.connect() as connection:
connection.execute(#some-query)
def execute_transaction():
with db.engine.connect() as connection:
with connection.begin() as transaction:
exec_query_1()
exec_query_2()
exec_query_3()
Run Code Online (Sandbox Code Playgroud)
鉴于应用程序是多线程的,这段代码会按预期工作吗?如果是,怎么办?如果不是,那么使其发挥作用的正确方法是什么?
即使在单线程中,代码也不会按预期工作。函数中打开的连接与1中使用的连接是分开的execute_transaction(),并且具有自己的事务。您应该安排代码,以便函数接收与正在进行的事务的连接作为参数:
def exec_query_1(connection):
connection.execute(#some-query)
def exec_query_2(connection):
connection.execute(#some-query)
def exec_query_3(connection):
connection.execute(#some-query)
def execute_transaction():
with db.engine.connect() as connection:
with connection.begin() as transaction:
exec_query_1(connection)
exec_query_2(connection)
exec_query_3(connection)
Run Code Online (Sandbox Code Playgroud)
请记住,连接不是线程安全的,因此不要在线程之间共享它们。“我什么时候构建一个会话,什么时候提交它,什么时候关闭它?” 是一本好书,虽然关于Session。
1可能取决于池配置。
| 归档时间: |
|
| 查看次数: |
2834 次 |
| 最近记录: |