SQLAlchemy:session.query.one()和session.add()在一个事务中

时间:2018-01-05 10:50:17

标签: python sql sqlalchemy

我希望仅当VALUE1包含TABLE1

行时,才能将TABLE2行添加到表VALUE2

我可以这样做:

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

1 个答案:

答案 0 :(得分:0)

如果您在TABLE1.VALUE1上拥有唯一键,则可以先查询 TABLE2并尝试插入TABLE1。如果VALUE1中已存在TABLE1,则会抛出错误,您将能够回滚该事务。

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