我试图在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刷新到db就像预期的那样工作,process_bind_param方法也能工作。事后取回来,就不会了。result_processor方法的进程函数中的值参数已经是一个timedelta对象。连接到哪里,处理相对对象的原始值?还是有更好的方法?
发布于 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连接对象,并在连接事件中设置您想要的适配器。
https://stackoverflow.com/questions/19294434
复制相似问题