如何在Python中更改模块级对象? (如Pylons元对象)

时间:2012-05-20 08:35:15

标签: python sqlalchemy pylons

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

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

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的最佳实践)。

1 个答案:

答案 0 :(得分: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