假设有一个 model 叫 StockModel, 有一个 Integer 型的 remaining 字段,然后有以下操作:
stock = session.query(StockModel).first()
with session.no_autoflush:
try:
stock = StockModel.remaining - 1 # sql: remaining = remaining - 1
# 此时 stock 是 <sqlalchemy.sql.elements.BinaryExpression>
# 若要再对 stock 进行比较,如下:
if stock.remaining > 10:
pass
# 则会直接报错:
# TypeError: Boolean value of this clause is not defined
# 我现在的解决方式是,如果 stock 是 BinaryExpression 的话,就避免
# 进行比较,直接做减法操作,然后在 commit 之后做二次校验。。。
# 如下:
if isinstance(stock.remaining, BinaryExpression):
stock.remaining = StockModel.remaining - (stock.remaining.right.value + decrease_amount)
session.commit()
# 在这里做二次校验:
if stock.remaining < 0:
raise Expression("Stock not enough")
except BaseException:
session.rollback()
finally:
session.close()
请问各位大佬,有没有更优雅的解决方案呢……在 sqlalchemy 的文档里徜徉了许久还是木有找到想要的解决办法……
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.