python - SQLAlchemy 的 session.merge() 可以用数据库中的新数据更新它的结果吗?

标签 python sqlalchemy

SQLAlchemy 文档说“session.merge() 协调实例的当前状态及其关联的子项与数据库中的现有数据”。

现有对象的状态是否会被数据库中的新数据更新?如何?什么时候?

最佳答案

SQLAlchemy 被设计为在 session 中具有具有每个标识的单个对象。但有时您必须重新创建具有已知标识的对象,例如当您从网络获取它或实现离线锁定以避免长时间交易时。当您创建一个可能存在于数据库中的具有已知身份的对象时, session 有可能已经跟踪具有该身份的对象。这就是 merge() 方法的用途:它返回附加到 session 的对象,从而避免 session 中具有相同标识的重复对象。下面是一个说明正在发生的事情的例子:

from sqlalchemy import *
from sqlalchemy.orm import *

metadata = MetaData()

t = Table(
    't', metadata,
    Column('id', Integer, primary_key=True),
    Column('state', String(10)),
)

class Model(object): pass

mapper(Model, t)

engine = create_engine('sqlite://')
metadata.create_all(engine)

session = sessionmaker(bind=engine)()

obj1 = Model()
obj1.state = 'value1'
session.add(obj1)
session.commit()
obj_id = obj1.id

obj2 = Model()
obj2.id = obj_id
obj2.state = 'value2'
obj3 = session.merge(obj2)
session.commit()
print obj3 is obj1, obj3 is obj2
print obj3.state

输出是:

True False
value2

于是session.merge(obj2)发现有一个相同标识的对象(上面创建的obj1),所以合并了obj2的状态 放入现有对象并返回它。

下面是另一个例子,说明从数据库加载状态:

# ...skipped...

t = Table(
    't', metadata,
    Column('id', Integer, primary_key=True),
    Column('state1', String(10)),
    Column('state2', String(10)),
)

# ...skipped...

obj1 = Model()
obj1.state1 = 'value1-1'
obj1.state2 = 'value2-1'
session.add(obj1)
session.commit()
obj_id = obj1.id
session.expunge_all()

obj2 = Model()
obj2.id = obj_id
obj2.state1 = 'value1-2'
obj3 = session.merge(obj2)
session.commit()
print obj3 is obj1, obj3 is obj2
print obj3.state1, obj3.state2

输出是:

False False
value1-2 value2-1

现在 merge() 没有在 session 中找到具有相同标识的对象,因为我们删除了它。我还创建了部分分配状态的新对象,但其余部分是从数据库加载的。

关于python - SQLAlchemy 的 session.merge() 可以用数据库中的新数据更新它的结果吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1849567/

相关文章:

python - 导入错误: cannot import name 'ft2font' from partially initialized module 'matplotlib'

python - 为什么同样的字符串在python2和python3中print的输出不同?

python - 如何从类本身实例化类的对象?

Python session.commit() 更新现有行而不是插入新行

python - sqlalchemy 表模式自动加载

python - Pandas groupby mean - 进入数据框?

python - 使用Python从数据库中提取

python - 使用 SQLAlchemy 在 MySQL 中存储 Python 3 枚举

python - 将嵌套的 Python 对象转换为字典的最经济的方法是什么?

python - 我如何在 SQL 查询中伪造这些数据