gpt4 book ai didi

python - 为什么 Elixir/SQLAlchemy 的 session.bind 在线程内设置为 None?

转载 作者:太空宇宙 更新时间:2023-11-03 19:28:53 24 4
gpt4 key购买 nike

我将从一些简化的测试代码开始来演示我引用的问题。

t_model.py

from elixir import *

metadata.bind = 'sqlite:///test.db'
session.bind = metadata.bind

t_main.py

#!/usr/bin/python  
import t_model
import threading

class TestThread(threading.Thread):
def run(self):
print 'Thread ID: %s, t_model.session.bind = %s' % (threading.current_thread(), t_model.session.bind)

class Test(object):
def run(self):
print 'Thread ID: %s, t_model.session.bind = %s' % (threading.current_thread(), t_model.session.bind)

if __name__ == "__main__":
Test().run()
TestThread().run()
TestThread().start()

t_main.py 的输出:

Thread ID: <_MainThread(MainThread, started 140111907010336)>, t_model.session.bind = Engine(sqlite:///test.db)
Thread ID: <_MainThread(MainThread, started 140111907010336)>, t_model.session.bind = Engine(sqlite:///test.db)
Thread ID: <TestThread(Thread-2, started 140111865108224)>, t_model.session.bind = None

我意识到 Elixir/SQLAlc 正在做一些底层工作来实例化线程的新 session (我猜)。我相信这就是Ants Aasma对this question的回应地址。但是,为什么它不继承这样设置的字段呢?有没有办法确保类似的事情能够延续下去?

我需要将引擎绑定(bind)到 session ,以便我可以进行某些原始 SQL 查询,但是一旦我实例化一个线程,它就会忘记该值。

你们可以提供任何见解来帮助我更好地理解正在进行的工作以及如何避免每次初始化新线程并设置引擎时都必须设置 t_model.session.bind 吗?

最佳答案

尝试替换这个:

session.bind = metadata.bind

与:

session.configure(bind=metadata.bind)

关于python - 为什么 Elixir/SQLAlchemy 的 session.bind 在线程内设置为 None?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7004169/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com