从使用NULL作为主键的表中删除时,sqlalchemy FlushError

时间:2019-06-06 16:11:45

标签: python sql sqlalchemy

我在sqlalchemy中创建了一个具有多个主键的表,这些键之一是可为空的。从表中删除行时,session.query(Foo).delete()有效,但是session.delete(session.query(Foo).first())抛出FlushError

这是预期的行为吗?有什么办法可以解决这个问题?

我在下面提供了一个完整的示例。 Python版本为2.7.11,sqlalchemy版本为1.1.9

import sqlalchemy as sql
import sqlalchemy.ext.declarative

Base = sqlalchemy.ext.declarative.declarative_base()


class Foo(Base):
    __tablename__ = 'foo'
    foo = sql.Column(sql.String, primary_key=True, nullable=False)
    bar = sql.Column(sql.String, primary_key=True, nullable=False)
    baz = sql.Column(sql.String, primary_key=True, nullable=True)
    bif = sql.Column(sql.Integer, nullable=False)


def main():
    print sql.__version__
    engine = sql.create_engine('sqlite://')
    Base.metadata.create_all(engine)
    Session = sql.orm.sessionmaker(bind=engine)
    session = Session()
    session.add(Foo(foo='0', bar='bar', baz='baz', bif=1))
    session.add(Foo(foo='1', bar='bar', baz=None, bif=1))
    session.add(Foo(foo='2', bar='bar', baz=None, bif=1))
    print session.query(Foo).all()
    # this throws a Flush error
    x = session.query(Foo).filter(Foo.foo == '2').first()
    session.delete(x)

    # this works
    session.query(Foo).filter(Foo.foo == '1').delete()

    # this throws a Flush error
    x = session.query(Foo).filter(Foo.foo == '0').first()
    session.delete(x)

    print session.query(Foo).all()


if __name__ == '__main__':
    main()

0 个答案:

没有答案