当我尝试使用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中它被考虑在内。
我认为即使使用方法#1,sqlalchemy也将使用class_mapper。
无法理解为什么这种行为的差异。
有人可以帮助我理解为什么使用方法#1更新调用没有考虑到version_id列?或者我错过了什么?
答案 0 :(得分:1)
我可以找到任何答案,然后将问题发布在&sq; sqlalchemy-dev'基。
感谢Michael Bayer不遗余力地回答我的问题。
思想将分享这里的答案链接,以便让其他人受益。
https://groups.google.com/forum/#!topic/sqlalchemy-devel/JUqlWKtRa4g