1

我想从连接到我的 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

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

4

2 回答 2

1

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

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:.

于 2012-10-12T14:14:18.430 回答
0

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

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

if __name__ == '__main__':
    main()

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

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

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

于 2012-10-13T09:04:24.443 回答