我正在开发一个使用 SQLAlchemy 进行数据库访问的 Python 服务器应用程序。我想在 meta.py 模块中包含引擎、 session 和元数据对象,这些对象在整个程序中用于访问数据库(类似于 Pylons 约定)。
engine和session对象在meta.py模块中初始化为None,然后在其他模块中实际赋值。例如
模型/meta.py:
engine = None
Session = None
metadata = Metadata()
模型/__init__.py:
from simplesite.model import meta
def init_model():
# ...
sm = orm.sessionmaker(...)
meta.Session = orm.scoped_session(sm)
问题是当我在另一个模块中导入并运行 init_model(),然后从 meta.py 导入 Session 时,它仍然设置为 None。即
from model.meta import Session
from model import init_model
init_model()
# Session is still None!
有人可以告诉我这是为什么和/或它在 Pylons 应用程序中如何工作吗?我猜答案会是关于 Python 工作原理的更基本的东西?
关于如何在整个应用程序中进行单点数据库访问的替代建议也将受到赞赏(即在大型应用程序中使用 SQLAlchemy 的最佳实践)。
请您参考如下方法:
我正在回答这个问题,因为它看起来只是坐在这里,尽管@katrielalex 在评论中给出了答案。
当您执行 from model.meta import Session 时,您会创建一个名为 Session 的新本地变量,该变量绑定(bind)到该模块中的对象。当 init_model() 运行时,它会重新绑定(bind) meta 模块中的名称,但这不会影响您的局部变量。
您可以通过在 init_model() 完成其工作之前不访问 meta.Session 来达到您想要的效果:
from model import meta
from model import init_model
init_model()
Session = meta.Session
