gpt4 book ai didi

python - 在 SQLAlchemy 中跟踪模型更改

转载 作者:IT老高 更新时间:2023-10-28 21:01:56 26 4
gpt4 key购买 nike

我想记录使用某些 SQLAlchemy-Model 将完成的每个操作。

所以,我有一个 after_insert、after_delete 和 before_update 钩子(Hook),我将在其中保存模型的先前和当前表示,

def keep_logs(cls):
@event.listens_for(cls, 'after_delete')
def after_delete_trigger(mapper, connection, target):
pass

@event.listens_for(cls, 'after_insert')
def after_insert_trigger(mapper, connection, target):
pass

@event.listens_for(cls, 'before_update')
def before_update_trigger(mapper, connection, target):
prev = cls.query.filter_by(id=target.id).one()
# comparing previous and current model


MODELS_TO_LOGGING = (
User,
)
for cls in MODELS_TO_LOGGING:
keep_logs(cls)

但是有一个问题:当我试图在 before_update 钩子(Hook)中查找模型时,SQLA 返回修改(脏)版本。如何在更新之前获得以前版本的模型?是否有其他方法来保持模型更改?

谢谢!

最佳答案

SQLAlchemy 跟踪每个属性的更改。您不需要(也不应该)在事件中再次查询该实例。此外,任何已修改的实例都会触发该事件,即使该修改不会更改任何数据。循环遍历每一列,检查它是否已被修改,并存储任何新值。

@event.listens_for(cls, 'before_update')
def before_update(mapper, connection, target):
state = db.inspect(target)
changes = {}

for attr in state.attrs:
hist = attr.load_history()

if not hist.has_changes():
continue

# hist.deleted holds old value
# hist.added holds new value
changes[attr.key] = hist.added

# now changes map keys to new values

关于python - 在 SQLAlchemy 中跟踪模型更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29921260/

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