【问题标题】:Accessing Pyramid database outside of WSGI instance在 WSGI 实例之外访问 Pyramid 数据库
【发布时间】:2012-10-13 17:04:24
【问题描述】:

我想从连接到我的 Pyramid 应用程序的数据库中的条目创建一个 Whoosh 索引。但是,我不确定如何在应用程序之外访问数据库。

所以我的models.py初始化如下:

from sqlalchemy import (
    Column,
    Integer,
    Text,
    String,
    ForeignKey,
    Table
    )

from sqlalchemy.ext.declarative import declarative_base

from sqlalchemy.orm import (
    scoped_session,
    sessionmaker,
    relationship,
    backref
    )

from sqlalchemy.dialects.mysql import DATETIME, FLOAT, TEXT

from zope.sqlalchemy import ZopeTransactionExtension

db_session = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
dbBase = declarative_base()
dbBase.query = db_session.query_property()  

然后在__init__.py中,有一个models中加载的例子:

from pyramid.config import Configurator
from sqlalchemy import engine_from_config
from .models import db_session, Recipe
def main(global_config, **settings):
    """ This function returns a Pyramid WSGI application.
    """
    engine = engine_from_config(settings, 'sqlalchemy.')

    db_session.configure(bind=engine)

我的production.ini 有引擎分配:

sqlalchemy.url = mysql+pymysql://username:password@localhost:3306/database?charset=utf8

所以当 WSGI 进程启动时调用 main,它从 .ini 文件传递​​引擎。但我想通过一个不依赖 WSGI 进程的脚本来访问数据库。我可以只分配引擎并将其绑定到脚本中的会话吗? extension=ZopeTransactionExtension() 对会话有何影响?

【问题讨论】:

    标签: python sqlalchemy pyramid


    【解决方案1】:

    alchemy 脚手架包含一个 initialize script,您可以将其用作示例。设置类似于以下示例,我为您评论过。

    config_uri = argv[1]  # Get config file name from arguments
    setup_logging(config_uri)  # In case you want ti use the logging config from the file
    settings = get_appsettings(config_uri)  # Get a settings dir from the file
    engine = engine_from_config(settings, 'sqlalchemy.')  # Setup the engine from the settings
    DBSession.configure(bind=engine)  # Configure the session to use the engine
    with transaction.manager:  # Do stuff in a transaction
        # Do DB stuff
    

    ZopeTransactionExtension 仅表示需要提交数据库工作,因此您要么以 transaction.commit() 结束代码,要么将其包装成 with transaction.manager:

    【讨论】:

    • 我仍然不确定如何运行它,因为我在导入 ..models 时收到“ValueError: Attempted relative import in non-package”。我试过在父目录中运行,所有目录中似乎都有 init.py 文件。
    【解决方案2】:

    Pyramid 文档中有一个部分涉及编写脚本,但它隐藏在 Command-Line section 中。相关的部分是initializedb.py 已经被转换为控制台脚本,它在bin 目录中创建了一个脚本。这就是使用相对导入来导入models 的原因。

    目前这对于我的需求来说似乎有点多余,所以我仍然需要一些更简单的东西。解决方案包括:

    if __name__ == '__main__':
        main()
    

    在我的脚本中,然后从包含我的production.ini 文件的目录中调用脚本:

    ../bin/python -m myproject.scripts.whooshindex production.ini 
    

    -m 将模块作为脚本运行。这修复了相对导入,从而利用了预定义 initializedb.py 脚本的所有优点。

    【讨论】:

    • 如今,金字塔文档告诉您按照@madjar - pyramid.readthedocs.org/en/latest/narr/… 的建议正确使用 console_scripts 所需了解的一切@
    • 我们可以使用 pshell 和适当的 .ini 文件(development.ini 或 production.ini)然后导入模型的 DBSession 等等吗?这对我行得通。我已经做到了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 2014-12-12
    • 2010-10-06
    • 2019-01-31
    • 2021-01-20
    • 2020-07-14
    • 1970-01-01
    相关资源
    最近更新 更多