确定 SQLAlchemy 对象上的哪些字段是脏字段

问题描述 投票:0回答:2

我知道,使用 SQLAlchemy 的

session
对象,我可以调用
session.dirty
来获取所有需要提交到数据库的更改的对象。但是我如何确定任一对象上的哪些特定字段是脏的?是否有一个方法可以调用返回这些字段的特定对象?或者也许我可以将对象传递到
session
的类方法之一来获取它?

postgresql sqlalchemy
2个回答
13
投票

来自

History
课程的示例:

from sqlalchemy import inspect

hist = inspect(myobject).attrs.myattribute.history

如果您想检查给定对象实例的所有定义属性,您可能可以这样做:

def print_changes(myobj):
    from sqlalchemy.orm import class_mapper
    from sqlalchemy import inspect
    inspr = inspect(myobj)
    attrs = class_mapper(myobj.__class__).column_attrs  # exclude relationships
    for attr in attrs:
        hist = getattr(inspr.attrs, attr.key).history
        print(attr.key, hist.has_changes())

0
投票
_MT = TypeVar("_MT", SAModel)

class BaseRepository(Generic[_MT]):
    _model: type[_MT]

    def __init__(self, session: AsyncSession) -> None:
        self._session = session

    ...

    async def save(self, instance: _MT) -> _MT:
        """
        Save a new model instance or update if exists
        """
        inspr = inspect(instance)
        if not inspr.modified and inspr.has_identity:
            return instance

        self._session.add(instance)
        await self._session.flush()
        await self._session.refresh(instance)

        return instance
© www.soinside.com 2019 - 2024. All rights reserved.