我想从连接到我的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()
如何影响会话?
答案 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
脚本的所有好处。