我的代码如下
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
class Status(db.Model):
__tablename__ = 'status'
process_id = db.Column(db.Integer, unique=True)
process_name = db.Column(db.String(20))
process_status = db.Column(db.String(10))
@classmethod
def find_by_id_status(cls, process_status, process_id):
return cls.query.filter_by(process_status=process_status, process_id=process_id).first()
def save_to_db(self):
db.session.add(self)
db.session.commit()
我可以通过获取记录进行更新,并以以下方式更新
process = Status.find_by_id_status(process_status="pending", process_id="12345")
process.process_status = "processing"
process.save_to_db()
但在我的场景中,存在更新相同内容的并行请求。
我希望第一个请求只更新相同的内容,并为进一步的请求抛出错误
相当于mysqlshell命令
UPDATE status SET process_status = "processing" WHERE process_status = "pending" AND process_id = "12345"
返回第一个请求
查询正常,0行受影响(0.01秒(匹配的行:1已更改:1警告:0
对于进一步的请求
查询正常,0行受影响(0.01秒(匹配的行:0已更改:0警告:0
请帮助我使用炼金术"bindparam"或任何其他方式实现同样的目的。。。提前感谢
我找到了解决方案:-
相当于sql shell cmd
UPDATE status SET process_status = "processing" WHERE process_status = "pending" AND process_id = "12345"
SQL中的Alchemy是
# add this to existing methods
@classmethod
def update_status(cls, process_id, process_status, new_status):
return cls.query.filter_by(
process_id=process_id,
process_status=process_status
).update(
{
'process_status': new_status
},
synchronize_session='fetch'
)
用法首次请求
result = Status.update_status(process_id="12345", process_status="pending", new_status="processing")
打印结果
1
(1条记录匹配并更新(
下一次
result = Status.update_status(process_id="12345", process_status="pending", new_status="processing")
打印结果
0
(匹配0条记录(