mysql - 使用 version_id 列更新实体(乐观离线锁)

标签 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 中考虑到了它。

我认为即使使用 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/

相关文章:

php - sql查询获取同一列的两个不同值

Mysql事务校验错误

python - SQLAlchemy:将多个实例映射到同一行

python - 使用带有 CTE 的联合时,由 sqlalchemy 生成的格式错误的查询

mysql - phpmyadmin mysql 外键

MySql 插入选择 uuid()

python - 对 JSON 字段的更新不会持久保存到数据库

python - 通过 alembic 脚本并发数据库表索引

python - 如何使用 WTForms 和 SQLAlchemy 填充多对多关系?

mysql - 使用解析器将 HTML 内容解析到 MySQL 数据库中