Python SQLAlchemy唯一对象模式

Python SQLAlchemy唯一对象模式,python,sqlalchemy,Python,Sqlalchemy,过去,我在一个项目中工作,该项目包含了该模式的一个版本。那个特定的代码不是我写的,在寻找一些信息时,我找到了原始配方。我试图理解它,但一些细节浮现在我的脑海中 在项目中完成的实现与wiki中提供的实现非常相似,但不是\u unique,get\u unique被实现为公共基础模型的classmethod。它接受任意参数,并且几乎执行wiki中的\u unique所做的操作,但是已经决定了hashfunc、queryfunc和构造函数的参数: class Model(Base): @cla

过去,我在一个项目中工作,该项目包含了该模式的一个版本。那个特定的代码不是我写的,在寻找一些信息时,我找到了原始配方。我试图理解它,但一些细节浮现在我的脑海中

在项目中完成的实现与wiki中提供的实现非常相似,但不是
\u unique
get\u unique
被实现为公共基础模型的classmethod。它接受任意参数,并且几乎执行wiki中的
\u unique
所做的操作,但是已经决定了
hashfunc
queryfunc
构造函数的参数:

class Model(Base):
    @classmethod
    def get_unique(cls, session, **kwargs):
        """Get or create an instance based on unique values.
        """
        cache = getattr(session, '_unique_cache', None)
        if cache is None:
            session._unique_cache = cache = {}

        key = (cls, tuple(kwargs.items()))
        o = cache.get(key)

        if o is not None and was_deleted(o):
            o = None

        if o is None:
            with session.no_autoflush:
                o = session.query(cls).filter_by(**kwargs).first()

            if o is None:
                o = cls(**kwargs)
                session.add(o)

            cache[key] = o

        return o
我知道此实现的一些注意事项,其中最重要的一点是kwargs的顺序对
键的构造非常重要。我的问题是:

  • 是否有任何理由将查询包含在
    no\u autoflush
    上下文中?如果程序员云决定是否使用
    autoflush
    调用
    get_unique
    ,会有什么问题?wiki配方还使用
    no_autoflush
    执行查询,我想知道是否有什么东西逃过了我的理解

  • 为什么要缓存对象?当会话已经执行类似的任务并且知道何时必须从数据库中重新检索对象时,我不认为缓存对象有什么意义

  • 因此,以下不使用缓存并让程序员决定是否需要
    no_autoflush
    上下文的实现是否有问题

  • class Model(Base):
        @classmethod
        def get_unique(cls, session, **kwargs):
            """Get or create an instance based on unique values.
            """
            o = session.query(cls).filter_by(**kwargs).first()
            if o is None:
                o = cls(**kwargs)
                session.add(o)
            return o