在具有version_id列的更新实体上(乐观脱机锁定)

时间:2014-03-22 07:39:40

标签: mysql sqlalchemy

当我尝试使用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列?或者我错过了什么?

1 个答案:

答案 0 :(得分:1)

我可以找到任何答案,然后将问题发布在&sq; sqlalchemy-dev'基。

感谢Michael Bayer不遗余力地回答我的问题。

思想将分享这里的答案链接,以便让其他人受益。

https://groups.google.com/forum/#!topic/sqlalchemy-devel/JUqlWKtRa4g