gpt4 book ai didi

python - 使用 inspect 获取模型关系的历史记录

转载 作者:太空狗 更新时间:2023-10-30 03:03:33 26 4
gpt4 key购买 nike

我能够使用 sqlalchemy 的检查功能查找特定模型的任何正常值的历史记录。但是,当我尝试获取关系(或其相关的 ForeignKey 列)的历史记录时,它只显示新值,而不显示以前的值。

有没有什么快速的方法可以获取像这样的关系的先前值,或者我需要使用其他函数,还是完全自己动手?

我使用的基本代码看起来像

class Person(db.Model):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80))
phone_id = db.Column(db.Integer(), db.ForeignKey("phone_number.id"))
phone = db.relationship("PhoneNumber")
class PhoneNumber(db.Model):
id = db.Column(db.Integer(), primary_key = True)
type = db.Column(db.String(20))
number = db.Column(db.String(11))

p = Person()
p.name = "Frank"
phone1 = PhoneNumber("Mobile", "1234567890") #__init__ function handles these args
phone2 = PhoneNumber("Home", "9876543210")
p.phone = phone1
db.session.add_all([p, phone1, phone2])
db.session.commit()
p.phone = phone2
history = db.inspect(p).attrs.get("phone").history
# history is sqlalchemy.orm.attributes.History(([<PhoneNumber('Home', '9876543210')>], (), ()))
# history.added is ([<PhoneNumber('Home', '9876543210')>])
# history.deleted is () but should be ([<PhoneNumber('Mobile', '1234567890')>])

最佳答案

标量属性的“旧”值如果不存在,通常不会从数据库中加载,因为这通常是浪费(在这种情况下,session.commit() 会使所有属性过期,因此 Person.phone 在分配了新值)。异常(exception)情况包括当该列是主键列时,或者与简单多对一以外的标量关系。可以通过在相关属性上使用“active_history”选项来强制加载“旧”值。

from sqlalchemy import *
from sqlalchemy.orm import *
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Person(Base):
__tablename__ = 'person'
id = Column(Integer(), primary_key=True)
name = Column(String(80))
phone_id = Column(Integer(), ForeignKey("phone_number.id"))
phone = relationship("PhoneNumber", active_history=True)

class PhoneNumber(Base):
__tablename__ = 'phone_number'
id = Column(Integer(), primary_key=True)
type = Column(String(20))
number = Column(String(11))

e = create_engine("sqlite://", echo=True)
Base.metadata.create_all(e)

session = Session(e)

p = Person()
p.name = "Frank"
phone1 = PhoneNumber(type="Mobile", number="1234567890")
phone2 = PhoneNumber(type="Home", number="9876543210")
p.phone = phone1
session.add_all([p, phone1, phone2])
session.commit()
p.phone = phone2
history = inspect(p).attrs.get("phone").history

assert history == ([phone2], (), [phone1])

关于python - 使用 inspect 获取模型关系的历史记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18522442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com