Ứng dụng của tôi SQLAlchemy (chạy trên đầu trang của MariaDB) bao gồm hai mô hình MyModelA
và MyModelB
hợp tổ chức đó là một đứa trẻ kỷ lục của cựu:Lỗi trong SQLAlchemy Rollback sau khi ngoại lệ DB?
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)
Đây là những trường hợp của MyModelA
và MyModelB
mà tôi tạo ra:
>>> my_a = MyModelA(my_field1="A1")
>>> my_a.aid
1
>>> MyModelB(a_id=my_a.aid, my_field2="B1")
tôi có đoạn mã sau đó xóa các thể hiện của MyModelA
nơi 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()
Khi tôi chạy cái nhìn mã này ở kết quả bất ngờ tôi nhận được:
#1) Number of MyModelAs: 1
#2) Cannot delete instance of MyModelA because it has child record(s)!
#3) Number of MyModelAs: 0
Các xóa được cho là thất bại và DB ném một ngoại lệ mà gây ra một rollback. Tuy nhiên, ngay cả sau khi quay trở lại, số hàng trong bảng cho biết rằng hàng - được cho là không bị xóa - thực sự đã biến mất !!!
Tại sao điều này lại xảy ra? Làm thế nào tôi có thể sửa lỗi này? Nó có vẻ giống như một lỗi trong SQLAlchemy.
bạn đã kiểm tra xem có tự động vô hiệu hóa không? –
cùng một ý tưởng: bạn nói rằng bạn sử dụng MariaDB. Loại động cơ nào trong MariaDB? MyISAM không hỗ trợ các giao dịch, vì vậy nó luôn ở chế độ "tự động" –
Các truy vấn được tạo ra bởi sqlalchemy là gì? 'SELECTs' có' FOR UPDATE' không? –