Sqlalchemy 的一个问题,在同一 transaction 中的 BinaryExpression 的比较问题

2017-08-21 16:08:13 +08:00
 MarcoQin

假设有一个 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 的文档里徜徉了许久还是木有找到想要的解决办法……

1730 次点击
所在节点    Python
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/384588

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX