我正在尝试在 sqlalchemy 中实现对相对日期范围(月、年)的基本支持。使用 postgres 作为数据库,我认为子类化 sqlalchemy.dialects.postgres.Interval 并将返回的 python 类型更改为 dateutil.relativedelta.relativedelta 将是最好/最快的方法。
from sqlalchemy import types
from sqlalchemy.dialects.postgres import INTERVAL
from dateutil import relativedelta
class DateInterval(INTERVAL):
def result_processor(self, dialect, coltype):
def process(value):
return value
return process
@property
def python_type(self):
return relativedelta.relativedelta
class MyInterval(types.TypeDecorator):
impl = DateInterval
def process_bind_param(self, value, dialect):
result = ''
for attr in ["years", "months", "days", "hours", "minutes", "seconds"]:
tempvalue = getattr(value, attr)
if tempvalue:
result += "%s %s " % (tempvalue, attr)
return result
def process_result_value(self, value, engine):
return value
@property
def python_type(self):
return relativedelta.relativedelta
刷新到数据库按预期工作,process_bind_param 方法有效。之后取它,不会。result_processor 方法的 process 函数中的 value 参数已经是 timedelta 对象。在哪里挂钩,将原始值处理为 relativedelta 对象?或者,还有更好的方法?