Python SQLAlchemy中dateutil.relativedelta支持的子类间隔

Python SQLAlchemy中dateutil.relativedelta支持的子类间隔,python,postgresql,sqlalchemy,Python,Postgresql,Sqlalchemy,我正在尝试在sqlalchemy中实现对相对日期范围(月、年)的基本支持。使用postgres作为数据库,我认为子类化sqlalchemy.dialogus.postgres.Interval并将返回的python类型更改为dateutil.relativedelta.relativedelta将是最好/最快的方法 from sqlalchemy import types from sqlalchemy.dialects.postgres import INTERVAL from dateuti

我正在尝试在sqlalchemy中实现对相对日期范围(月、年)的基本支持。使用postgres作为数据库,我认为子类化sqlalchemy.dialogus.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
刷新到db的过程按预期工作,进程绑定参数方法工作。 以后再取回它,就不会了。result_processor方法的process函数中的value参数已经是timedelta对象。在何处连接,将原始值处理为relativedelta对象?
还是有更好的方法?

psycopg2正在返回这些时间增量。如果您想要拦截这些,您需要在psycopg2级别进行扩充:也许您可以使用new_type()绕过psycopg2的默认类型转换器来处理INTERVAL对象

第一步是从普通的psycopg2连接/游标获取原始值,以确保您在该级别拥有控制权

然后,当您了解了如何获得该连接时,您可以截获新创建的psycopg2连接对象,并在事件中设置所需的适配器