【发布时间】:2014-10-18 12:25:08
【问题描述】:
我有一个 Pyramid / SQLAlchemy,MySQL python 应用程序。 当我执行原始 SQL INSERT 查询时,没有任何内容写入数据库。 但是,当使用 ORM 时,我可以写入数据库。我阅读了文档,阅读了有关 ZopeTransactionExtension 的信息,阅读了大量 SO 问题,但都无济于事。 到目前为止没有奏效的地方:
-
transaction.commit()- 没有任何内容写入数据库。我确实意识到这个声明对于 ZopeTransactionExtension 是必要的,但它在这里并没有发挥作用。 -
dbsession().commit- 因为我使用的是 ZopeTransactionExtension,所以不起作用 -
dbsession().close()- 什么都没写 -
dbsession().flush()- 什么都没写 -
mark_changed(session)-文件“/home/dev/.virtualenvs/sc/local/lib/python2.7/site-packages/zope/sqlalchemy/datamanager.py”,第 198 行,在 join_transaction 如果 session.twophase: AttributeError: 'scoped_session' 对象没有属性 'twophase'"
engine.execute(...)
我正在寻找如何使用 scoped_session(我的代码中为 dbsession())执行原始 SQL
这是我的 SQLAlchemy 设置 (models/__init__.py)
def dbsession():
assert (_dbsession is not None)
return _dbsession
def init_engines(settings, _testing_workarounds=False):
import zope.sqlalchemy
extension = zope.sqlalchemy.ZopeTransactionExtension()
global _dbsession
_dbsession = scoped_session(
sessionmaker(
autoflush=True,
expire_on_commit=False,
extension=extension,
)
)
engine = engine_from_config(settings, 'sqlalchemy.')
_dbsession.configure(bind=engine)
这是我为隔离问题而编写的 python 脚本。它类似于问题发生的真实环境。我只想让下面的脚本将数据插入数据库:
# -*- coding: utf-8 -*-
import sys
import transaction
from pyramid.paster import setup_logging, get_appsettings
from sc.models import init_engines, dbsession
from sqlalchemy.sql.expression import text
def __main__():
if len(sys.argv) < 2:
raise RuntimeError()
config_uri = sys.argv[1]
setup_logging(config_uri)
aa = init_engines(get_appsettings(config_uri))
session = dbsession()
session.execute(text("""INSERT INTO
operations (description, generated_description)
VALUES ('hello2', 'world');"""))
print list(session.execute("""SELECT * from operations""").fetchall()) # prints inserted data
transaction.commit()
print list(session.execute("""SELECT * from operations""").fetchall()) # doesn't print inserted data
if __name__ == '__main__':
__main__()
有趣的是,如果我这样做:
session = dbsession()
session.execute(text("""INSERT INTO
operations (description, generated_description)
VALUES ('hello2', 'world');"""))
op = Operation(generated_description='aa', description='oo')
session.add(op)
然后第一个打印输出原始的SQL插入行('hello2''world'),第二个打印输出两行行,实际上两行都插入到数据库中。
我无法理解为什么将 ORM 插入与原始 SQL 一起“修复”它。
我确实需要能够在 scoped_session 上调用 execute() 以使用原始 SQL 将数据插入数据库。有什么建议吗?
【问题讨论】:
标签: python mysql sqlalchemy pyramid