[英]SQLAlchemy: session.query.one() and session.add() in one transaction
仅当TABLE2
具有VALUE2
行时,我才想将VALUE1
行添加到表TABLE1
我可以做这样的事情:
session.query(TABLE2)
.filter(TABLE2.FIELD2 == VALUE2)
.update({TABLE2.FIELD2: VALUE2}) # without change. only for check
session.add(TABLE1(FIELD1=VALUE1))
session.commit()
但是我觉得奇怪的是我使用了update
而没有任何更新。
我想使用one
而不是update
但是它不支持事务。
更新:此解决方案是错误的...
这个简单的解决方案也是错误的:
my_flag = session.query(TABLE2).filter(TABLE2.FIELD2 == VALUE2).first()
# database can be updated here!
if my_flag:
session.add(TABLE1(FIELD1=VALUE1))
session.commit()
假设您在TABLE1.VALUE1
上具有唯一键,则可以首先查询TABLE2
并尝试插入到TABLE1
。 如果TABLE1
已经存在VALUE1
,则将引发错误,并且您将能够回滚该事务。
from sqlalchemy.sql import exists
value_exists = session.query(exists().where(TABLE2.KEY2 == VALUE2)).scalar()
if not value_exists:
return
try:
dbsession.add(...)
dbsession.commit()
except IntegrityError as e:
dbsession.rollback()
raise e
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.