SQLAlchemy 中的cache_ok 标志是什么?

Шах*_*Шах 5 python sqlalchemy

我有SQLAlchemy的下一个自定义类型装饰器:

class TimeStamp(TypeDecorator):
    impl = DateTime
    cache_ok = True
    LOCAL_TIMEZONE = datetime.utcnow().astimezone().tzinfo

    def process_literal_param(self, value, dialect):
        return self.imple.process_literal_param(value, dialect)

    @property
    def python_type(self):
        return self.impl.python_type

    def process_bind_param(self, value: datetime, dialect):
        if value is None:
            return None
        if value.tzinfo is None:
            value = value.astimezone(self.LOCAL_TIMEZONE)
        return value.astimezone(timezone.utc)

    def process_result_value(self, value, dialect):
        if value is None:
            return None
        if value.tzinfo is None:
            return value.replace(tzinfo=timezone.utc)
        return value.astimezone(timezone.utc)
Run Code Online (Sandbox Code Playgroud)

问题是SQLAlchemy要求我设置该cache_ok标志...我尝试在文档中阅读有关此标志的信息,但对我来说仍然不清楚。我不明白SQLAlchemy如何使用它。
它缓存什么?我的类型装饰器适合缓存吗?

Lok*_*nar 5

最近遇到这个问题,发现了你的问题,没有答案:(..进一步查看,查看文档..

TypeDecorator.cache_ok 类级标志指示此自定义 TypeDecorator 是否可以安全地用作缓存键的一部分。此标志默认为 None,当 SQL 编译器尝试为使用此类型的语句生成缓存键时,它最初会生成警告。如果 TypeDecorator 不能保证每次都产生相同的绑定/结果行为和 SQL 生成,则该标志应设置为 False;否则,如果该类每次都产生相同的行为,则可以将其设置为 True。有关其工作原理的更多说明,请参阅 TypeDecorator.cache_ok。

https://docs.sqlalchemy.org/en/14/core/custom_types.html#sqlalchemy.types.TypeDecorator

.. 因此,如果您确信您的 TypeDecorator 始终为给定值生成相同的绑定/结果,那么请继续通过cache_ok = True在 TypeDecorator 类中设置值来发出该语句。