首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么查询调用SQLAlchemy中的自动刷新?

为什么查询调用SQLAlchemy中的自动刷新?
EN

Stack Overflow用户
提问于 2015-10-03 19:50:19
回答 2查看 39.6K关注 0票数 35

上面看到的代码只是一个示例,但它可以重现此错误:

代码语言:javascript
运行
复制
sqlalchemy.exc.IntegrityError: (raised as a result of Query-invoked autoflush; 
consider using a session.no_autoflush block if this flush is occurring prematurely)
(sqlite3.IntegrityError) NOT NULL constraint failed: X.nn 
[SQL: 'INSERT INTO "X" (nn, val) VALUES (?, ?)'] [parameters: (None, 1)]

映射的实例仍会添加到会话中。实例想知道(这意味着对数据库的查询)是否存在具有相同值的其他实例。还有第二个属性/列(

)。它被指定为

..。但在默认情况下,它是

..。

当实例(如示例中的实例)仍被添加到会话中时,调用

调用自动刷新。此刷新将创建一个

它会尝试存储实例。这会失败,因为

仍然为空,并违反

约束。

这就是我目前所理解的。但问题是,为什么它会调用自动刷新?我能阻止它吗?

代码语言:javascript
运行
复制
#!/usr/bin/env python3

import os.path
import os
import sqlalchemy as sa 
import sqlalchemy.orm as sao
import sqlalchemy.ext.declarative as sad
from sqlalchemy_utils import create_database

_Base = sad.declarative_base()
session = None


class X(_Base):
    __tablename__ = 'X'

    _oid = sa.Column('oid', sa.Integer, primary_key=True)
    _nn = sa.Column('nn', sa.Integer, nullable=False) # NOT NULL!
    _val = sa.Column('val', sa.Integer)

    def __init__(self, val):
        self._val = val

    def test(self, session):
        q = session.query(X).filter(X._val == self._val)
        x = q.one()
        print('x={}'.format(x))

dbfile = 'x.db'

def _create_database():
    if os.path.exists(dbfile):
        os.remove(dbfile)

    engine = sa.create_engine('sqlite:///{}'.format(dbfile), echo=True)
    create_database(engine.url)
    _Base.metadata.create_all(engine)
    return sao.sessionmaker(bind=engine)()


if __name__ == '__main__':
    session = _create_database()

    for val in range(3):
        x = X(val)
        x._nn = 0
        session.add(x)
    session.commit()

    x = X(1)
    session.add(x)
    x.test(session)

当然,一个解决方案是

注释

在此之前将实例添加到会话中

被称为。这项工作。但在我的实际(但对于这个问题来说很复杂)用例中,这不是一个很好的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-18 17:33:51

如何关闭

自动刷新

功能:

临时:您可以使用

没有

_

自动刷新

查询数据库的代码段上的上下文管理器,例如

方法:

定义测试(自身、会话):使用session.no

_

自动刷新:Q= session.query(X).filter(X.

_

val == self。

_

val) x= q.one() print('x={}'.format(x))

会话范围:只传递

致您的sessionmaker:

返回sao.sessionmaker(bind=engine,autoflush=False)()

票数 54
EN

Stack Overflow用户

发布于 2021-03-01 22:53:32

我知道这是旧的,但它可能有助于其他一些人在使用flask-sqlalchemy时遇到这个错误。下面的代码修复了我的自动刷新问题。

代码语言:javascript
运行
复制
db = SQLAlchemy(session_options={"autoflush": False})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32922210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档