我SQLAlchemy的应用(上MariaDB的上运行)包括两种型号MyModelA
和MyModelB
其中,后者是前者的子记录:数据库异常后SQLAlchemy回滚中的错误?
class MyModelA(db.Model):
a_id = db.Column(db.Integer, nullable=False, primary_key=True)
my_field1 = db.Column(db.String(1024), nullable=True)
class MyModelB(db.Model):
b_id = db.Column(db.Integer, nullable=False, primary_key=True)
a_id = db.Column(db.Integer, db.ForeignKey(MyModelA.a_id), nullable=False)
my_field2 = db.Column(db.String(1024), nullable=True)
这些是我创造的MyModelA
和MyModelB
实例:
>>> my_a = MyModelA(my_field1="A1")
>>> my_a.aid
1
>>> MyModelB(a_id=my_a.aid, my_field2="B1")
我有下面的代码删除的MyModelA
的实例,其中a_id==1
:
db.session.commit()
try:
my_a = MyModelA.query.get(a_id=1)
assert my_a is not None
print "#1) Number of MyModelAs: %s\n" % MyModelA.query.count()
db.session.delete(my_a)
db.session.commit()
except IntegrityError:
print "#2) Cannot delete instance of MyModelA because it has child record(s)!"
db.session.rollback()
print "#3) Number of MyModelAs: %s\n" % MyModelA.query.count()
当我运行这段代码看看意想不到的结果我得到:
#1) Number of MyModelAs: 1
#2) Cannot delete instance of MyModelA because it has child record(s)!
#3) Number of MyModelAs: 0
的删除据说失败和DB抛出导致回滚异常。然而,即使在回滚之后,表中的行数也表明该行(据说未被删除)实际上已经消失了!
这是怎么发生的?我怎样才能解决这个问题?这看起来像SQLAlchemy中的一个错误。
你检查autocommit是否被禁用? –
同样的想法:你说你使用MariaDB。 MariaDB中的哪种引擎? MyISAM不支持事务,所以它始终处于“自动提交”模式 –
sqlalchemy生成的查询是什么? “SELECTs”有“FOR UPDATE”吗? –