首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dateutil.relativedelta支持在SQLAlchemy中的子类间隔

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

Stack Overflow用户
提问于 2013-10-10 11:22:56
回答 1查看 755关注 0票数 2

我试图在sqlalchemy中实现对相对日期(月、年)的基本支持。使用postgres作为数据库,我认为子类sqlalchemy.dialects.postgres.Interval和将返回的python类型更改为dateutil.relativedelta.relativedelta是最好的/最快的方法。

代码语言:javascript
复制
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就像预期的那样工作,process_bind_param方法也能工作。事后取回来,就不会了。result_processor方法的进程函数中的值参数已经是一个timedelta对象。连接到哪里,处理相对对象的原始值?还是有更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-10 18:49:58

psycopg2正在返回那些时间差。如果您想拦截这些数据,您需要在psycopg2级别上进行补充:http://initd.org/psycopg/docs/advanced.html#type-casting-of-sql-types-into-python-objects,也许您可以使用new_type()来绕过new_type 2对INTERVAL对象的默认类型转换器。

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

然后,当您知道了如何获得它之后,就可以拦截新创建的psycopg2连接对象,并在连接事件中设置您想要的适配器。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19294434

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档