我在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()