【发布时间】:2012-06-24 14:36:32
【问题描述】:
我正在开发一个使用 SQLAlchemy 进行数据库访问的 Python 服务器应用程序。我想在 meta.py 模块中包含引擎、会话和元数据对象,这些对象在整个程序中用于访问数据库(如 Pylons 约定)。
engine和session对象在meta.py模块中初始化为None,然后在其他模块中实际赋值。例如
model/meta.py:
engine = None
Session = None
metadata = Metadata()
model/__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 的最佳实践)。
【问题讨论】:
-
你正在做的很好。问题是
from model.meta import Session将meta.Session中的值绑定到名称Session,当名称meta.Session更改时它不会更改。相反,只需执行from model import meta,然后将Session查找为meta.Session。 -
事实上,想想如果来自另一个模块的代码可以改变你的局部变量,那该有多不爽!!
-
谢谢,这就是我正在寻找的答案。我现在使用 from model import meta,然后通过 meta.Session 引用该对象,它可以工作
-
请回答并关闭问题。
标签: python sqlalchemy pylons