【发布时间】:2021-08-23 18:09:26
【问题描述】:
这是我的问题的简化版本。我有一个程序query.py:
import time
from models import Ball, session
time.sleep(1)
r = session.query(Ball).filter(Ball.color=='red').first()
print(f'Red ball color is {r.color}')
time.sleep(2)
b = session.query(Ball).filter(Ball.color=='blue').first()
print(f'Blue ball color is {b.color}')
print(f'Red ball id is {r.id}, blue ball id is {b.id}')
当我与modify.py(包括在下面)同时运行query.py 时,我得到以下输出:
$ python modify.py &! python query.py
Red ball color is red
Blue ball color is red
Red ball id is 1, blue ball id is 1
问题是蓝球是红色的!
这里是models.py的内容:
import sqlalchemy as sa
import sqlalchemy.orm as sao
import sqlalchemy.ext.declarative as saed
Base = saed.declarative_base()
class Ball(Base):
__tablename__ = 'ball'
id = sa.Column(sa.Integer, primary_key=True)
color = sa.Column(sa.String)
engine = sa.create_engine('sqlite:///test.db')
Base.metadata.create_all(engine)
session = sao.Session(engine)
这里是modify.py:
import time
from models import Ball, session
session.query(Ball).delete()
b = Ball(color='red')
session.add(b)
session.commit()
time.sleep(2)
b.color = 'blue'
session.add(b)
session.commit()
我觉得很奇怪,我的数据库查询(查看最新的数据库状态)与通过我的数据库查询的 SQLAlchemy 身份映射返回的对象之间存在不一致(这是陈旧的,首先反映了数据库状态)读取相关行的时间)。我知道在每个查询之前在query.py 进程中重新启动我的事务将使身份映射中的缓存对象无效,并导致此处的蓝球为蓝色,但这是行不通的。
如果蓝球是蓝色的——即如果数据库查询和它返回的对象一致——或者如果蓝球查询返回None——我会很高兴——即如果并发数据库修改在查询事务。但我似乎被困在了中间。
【问题讨论】:
标签: python sqlite sqlalchemy