我有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如何使用它。
它缓存什么?我的类型装饰器适合缓存吗?
最近遇到这个问题,发现了你的问题,没有答案:(..进一步查看,查看文档..
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 类中设置值来发出该语句。