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

标签 python sqlalchemy pylons

我正在开发一个使用 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

关于python - 如何在 Python 中对模块级对象进行更改? (如 Pylons 元对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10671981/

相关文章:

python - 如何将所有生成的排列保存到 Numpy 数组中?

python - Sqlalchemy(和 alembic)没有多态联合的具体表继承

python - pyramid + jinja2 和新的 GAE 运行时

python - Django 可以用于 Web 服务吗?

Python-SqlAlchemy : Filter query by great circle distance?

python - 属性错误: 'ResultSet' object has no attribute 'encode'

python - 将第三方库转换为 asyncio

python - 我可以在 tkinter 中创建一个检查按钮来检查所有其他检查按钮吗?

sqlalchemy - 在 SQLAlchemy (+Flask) 中创建自引用 M2M 关系

python - SQLAlchemy 自定义属性