我有一个SQLAlchemy模型,其中包含一个产品列表。除了主键之外,还为每个产品分配了一个连续的数字产品标识符 (prod_id(。
保留prod_id值>= 10000。
因此,当添加新产品时,我需要将其分配给下一个可用prod_id,该应比最高电流prod_id大 1,忽略任何> 9999。
我可能可以在SQL中构造一些东西,但我正在努力形成一个将返回该值的SQLAlchemy查询。
我不担心竞争条件 - 这是一个简化的示例来说明问题。
模型:
class Product(db.Model):
__tablename__ = 'products'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
prod_id = db.Column(db.Integer)
其中prod_id是连续的商品标识码(保留了 prod_ids>=10000(。
在伪代码中,我正在寻找一个等效于以下内容的 SQLAlchemy 查询:
next_prod_id = 1 + max(Product.prod_id where Product.prod_id < 10000)
因此,例如,如果现有表是...
id name prod_id
1 Product A 1
2 Product B 2
3 Reserved A 10000
4 Product C 3
5 Reserved B 10001
6 Product D 4
。那么next_prod_id需要是 5。
这是我对查询的刺痛,但它不起作用(我无法整理的语法错误(:
next_prod_id = Product.query(func.max(Product.prod_id))
.filter_by(Product.prod_id < 10000) + 1
好的,设法获得func.max来完成这项工作。
这是我的解决方案 - 不确定它是否是最有效的,但它有效。
next_prod_id = db.session.query(db.func.max(Product.prod_id))
.filter(Product.prod_id < 10000)
.scalar() + 1