在WSGI实例之外访问Pyramid数据库

时间:2012-10-12 10:30:08

标签: python sqlalchemy pyramid

我想从连接到我的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中,有一个加载模型的例子:

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()如何影响会话?

2 个答案:

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

答案 1 :(得分:0)

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脚本的所有好处。