当我尝试更新具有 version_id 列的实体的某些值时,我遇到了以下问题。
这是我正在使用的代码片段:
BASE = declarative_base()
class Job(BASE):
__tablename__ = 'jobs'
id = Column(String(36), primary_key=True, default=uuid.uuid4)
worker_id = Column(String(36), nullable=True)
status = Column(String(255), nullable=True)
timeout = Column(DateTime, nullable=False)
version_id = Column(String(36))
__mapper_args__ = {
'version_id_col': version_id,
'version_id_generator': lambda version: uuid.uuid4()
}
更新作业实体的方法 #1:
query = session.query(Job)
.filter_by(id=job_id)
.update({'worker_id': worker_id, 'timeout': new_timeout)
SQLAlchemy 生成了以下查询 (mysql.log):
UPDATE jobs
SET worker_id='4a2350a1-f3ce-48f9-b29f-cc22e2e625fd',
timeout='2014-03-22 09:47:04.337521'
WHERE jobs.id ='84844301-446a-4912-85d7-92d9d462de5b'
更新作业实体的方法 #2:
job = session.query(Job).filter_by(id=job_id).first();
job.worker_id = worker_id
job.timeout = new_timeout
session.add(job);
session.flush()
SQLAlchemy 生成了以下查询 (mysql.log):
UPDATE jobs
SET worker_id='1634939b-d3c6-462d-8254-d7f09640ba71',
timeout='2014-03-22 11:10:51.879507',
version_id='aa9d3f74-3e4a-4bae-af38-fe0530dbf9b7'
WHERE jobs.id = '3e6ab855-179e-4f4f-bf3a-847cf19b30fa'
AND jobs.version_id = '2c1288ba-ad27-444c-9f56-764df4898c52'
我们可以注意到在方法#1 中从未考虑过 version_id 列,但在方法#2 中考虑到了它。
我认为即使使用 Approach#1 sqlalchemy 也会使用 class_mapper。
无法理解为什么会出现这种行为差异。
有人可以帮我理解为什么使用方法#1 更新调用没有考虑 version_id 列吗?还是我遗漏了什么?
最佳答案
因为我能找到任何答案,所以继续将我的问题发布到“sqlalchemy-dev”组中。
感谢 Michael Bayer 抽出宝贵时间回答我的问题。
为了造福他人,Thought 会在这里分享答案的链接。
https://groups.google.com/forum/#!topic/sqlalchemy-devel/JUqlWKtRa4g
关于mysql - 使用 version_id 列更新实体(乐观离线锁),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22574871/