插入不适用于SQLAlchemy数据库会话

el_*_*_le 6 python pylons sqlalchemy pyramid

为什么没有插入记录?有一个id返回但是当我检查数据库时没有新的记录.

来自models.py

from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))
Run Code Online (Sandbox Code Playgroud)

views.py

DBSession.execute(text('INSERT INTO (a,b,c) VALUES (\'a\',\'b\',\'c\') RETURNING id'), params=dict(a=a,b=b,c=c))
Run Code Online (Sandbox Code Playgroud)

我已尝试提交transaction.commit(),但没有收到错误,但没有插入记录.result.fetchone()[0]得到一个id.

而且DBSession.commit它得到

assert self.transaction_manager.get().status == ZopeStatus.COMMITTING, "Transaction must be committed using the transaction manager"
Run Code Online (Sandbox Code Playgroud)

Erg*_*rgo 13

这是因为您没有使用ORM插入新行,因为事务不知道它应该自己提交,因为事务状态没有标记为脏.

DBSession.execute在views.py中查询后放置以下代码.

from zope.sqlalchemy import mark_changed
session = DBSession()
session.execute(...your query...)
mark_changed(session)
Run Code Online (Sandbox Code Playgroud)

此时,事务应该能够正确提交您的查询,或者使用ORM来插入新行.

以下是关于这个主题的更多内容:

https://pypi.python.org/pypi/zope.sqlalchemy/0.7.4#id15

默认情况下,zope.sqlalchemy会在首次使用会话时将会话置于"活动"状态.ORM写操作会自动将会话移动到"已更改"状态.这可以避免不必要的数据库提交.有时需要通过SQL直接与数据库进行交互.无法猜测这样的操作是读还是写.因此,当手动SQL语句写入数据库时​​,我们必须手动将会话标记为已更改.