2

我正在开发一个使用 SQLAlchemy 进行数据库访问的 Python 服务器应用程序。我想在 meta.py 模块中有引擎、会话和元数据对象,这些对象在整个程序中用于访问数据库(如 Pylons 约定)。

引擎和会话对象None在 meta.py 模块中初始化,然后在其他模块中实际分配实际值。例如

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。IE

from model.meta import Session
from model import init_model

init_model()
# Session is still None!

有人可以告诉我为什么会这样和/或它在 Pylons 应用程序中是如何工作的吗?我猜答案将是关于 Python 如何工作的更基本的东西?

关于如何在整个应用程序中拥有单点数据库访问的替代建议也将受到赞赏(即在大型应用程序中使用 SQLAlchemy 的最佳实践)。

4

1 回答 1

1

我正在回答这个问题,因为它看起来只是坐在这里,尽管@katrielalex 在评论中给出了答案。

当您这样做时from model.meta import Session,您将创建一个名为的新局部变量Session,该变量绑定到该模块中的对象。运行时init_model(),它会重新绑定meta模块内的名称,但这不会影响您的局部变量。

您可以通过在完成工作meta.Session后才访问来达到您想要的效果:init_model()

from model import meta
from model import init_model
init_model()
Session = meta.Session
于 2012-06-24T06:36:32.570 回答