Типы переопределения SQLAlchemy. DateTime в выражениях sql - PullRequest
0 голосов
/ 25 августа 2010

возможно ли переопределить поведение type.DateTime по умолчанию при использовании sqlalchemy с необработанными выражениями sql?

, например, при использовании

myconnection.execute(text("select * from mytable where mydate > :mydate), {'mydate': mypythondatetimeobject)}

, я быхотелось бы, чтобы type.DateTime автоматически удалял TimeZone из объекта DateTime.

ОБНОВЛЕНИЕ: я обнаружил, что он работает с использованием bindparam и Typedecorator в запросе следующим образом:

class MyType(types.TypeDecorator):
    impl = types.DateTime

    def process_bind_param(self, value, dialect):
        if value is not None:
            return value.replace(tzinfo=None)

session.execute(
    text(myquery, bindparams=[bindparam('mydateparam', 
                                        type_=MyType())]), 
    {'mydateparam':mydate}
)

но я действительно не хочу использовать «bindparams» для каждого запроса.Разве нельзя просто заменить или переопределить типы по умолчанию. Поведение даты как-то?

1 Ответ

1 голос
/ 27 августа 2010

Если бы вы использовали выражения SQL, основанные на метаданных таблицы, вам просто нужно установить свой MyType в соответствующих столбцах. Подход простого текста теряет некоторое удобство. Вы можете вставить свой MyType в sqlalchemy.types.type_map, связанный с классом datetime, хотя в настоящее время это не публичный API.

Если бы это был я, я бы сделал:

def mytext(stmt, params):
    bindparams = []
    for k, v in params:
        if isinstance(v, datetime):
            type_ = MyType()
        else:
            type_ = None
        bindparams.append(bindparam(k, v, type_=type))
    return text(stmt, bindparams=bindparams)

, затем просто используйте mytext ("выберите * из таблицы, где date =: date", {'date': datetime.today ()})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...