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

发布于 2021-01-29 17:27:22

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

来自 models.py

from zope.sqlalchemy import ZopeTransactionExtension

DBSession = scoped_session(sessionmaker(extension=ZopeTransactionExtension()))

还有 views.py

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

我试过提交transaction.commit(),但不会出现错误,但不会插入记录。result.fetchone()[0]正在获取ID。

DBSession.commit得到

assert self.transaction_manager.get().status == ZopeStatus.COMMITTING, "Transaction must be committed using the transaction manager"
关注者
0
被浏览
92
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是因为您没有使用ORM在事务不知道它应该自己提交之前插入ORM,因为事务状态没有被标记为脏。

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

    from zope.sqlalchemy import mark_changed
    session = DBSession()
    session.execute(...your query...)
    mark_changed(session)
    

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

    以下是有关此主题的更多信息:

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

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



推荐阅读
知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看