gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 12:21:37 24 4
gpt4 key购买 nike

我正在尝试在 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 对象。在哪里 Hook ,将原始值处理为 relativedelta 对象?或者有更好的方法吗?

最佳答案

psycopg2 正在返回那些时间增量。如果你想拦截那些,你需要在 psycopg2 级别增加东西:http://initd.org/psycopg/docs/advanced.html#type-casting-of-sql-types-into-python-objects也许您可以使用 new_type() 来规避 psycopg2 对 INTERVAL 对象的默认类型转换器。

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

然后当您弄清楚如何获得它时,您可以拦截新创建的 psycopg2 连接对象并在 connect 中设置您想要的适配器。事件。

关于python - SQLAlchemy 中 dateutil.relativedelta 支持的子类间隔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19294434/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com