繁体   English   中英

SQLAlchemy:一次交易中的session.query.one()和session.add()

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM