私は 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 オブジェクトです。生の値をrelativedeltaオブジェクトに処理するために、どこにフックするのですか? それとももっと良い方法がありますか?