Фильтр дат sqlalchemy в сыром sql - PullRequest
       15

Фильтр дат sqlalchemy в сыром sql

4 голосов
/ 16 августа 2011

Раньше я создавал динамические фильтры, такие как

q = Session.query(Table)    
search_conditions = "%s ILIKE '%s%s%s'" % (str(nm), '%', val ,'%')
q = q.filter(search_conditions)

Это нормально работает для операторов string и int, но теперь мне нужно отфильтровать даты следующим образом.У меня есть столбец с датой, и я пытаюсь отфильтровать его следующим образом

date = '01.01.2011'
fd,fm,fy = date.split('.')
from_date = dt.date(int(fy),int(fm),int(fd))

ffilter = "%s > %r" %(str(ft), fromdate)
q = q.filter(ffilter)

Можете ли вы помочь мне с этим?

С наилучшими пожеланиями, Сергей

Ответы [ 3 ]

4 голосов
/ 17 августа 2011

Это не похоже на ужасно идиоматическую sqlalchemy. У вас уже есть объект Table, который вы используете для построения запроса, вы также можете использовать его для выражения предикатов в сгенерированном предложении WHERE, даже динамически:

date = '01.01.2011'
from_date = dt.datetime.strptime(date, "%d.%m.%Y").date()
q = session.query(Table) \
     .filter(Table.c[nm].like('%%%s%%' % val) ) \
     .filter(Table.c[ft] > from_date)

Во всяком случае, это главное преимущество использования sqlalchemy.

Этот шаблон распространяется почти на каждый угол sqlalchemy, например, если вы должны указать, какую таблицу выбрать для динамического выбора, это можно обработать, открыв свойство MetaData.tables, которое также дикт.

Если вам действительно нужна полная общность выразительности, предоставляемая пользователю, вам, вероятно, будет лучше обслужить это, просто разрешив ему вводить операторы SQL. Смешение генеративных запросов в стиле sqlalchemy с введенными пользователем выражениями, вероятно, не поможет помочь вам или вашим пользователям. Возможно, вы можете использовать SQLalchemy для генерации скелетных запросов, а затем позволить пользователям редактировать их, настраивая их так, как им нужно.

1 голос
/ 16 августа 2011

Не уверен, но почему бы не сделать следующее:

date = '01.01.2011'

ffilter = "%s > CAST('%s' AS DATE)" %(str(ft), date)
q = q.filter(ffilter)
0 голосов
/ 17 августа 2011

Фильтр, который вы хотите, должен, наконец, (перед отправкой в ​​базу данных) выглядеть так:

date_field > '2011-01-01'

Итак, попробуйте это:

date = '01.01.2011'
fd,fm,fy = date.split('.')
from_date = '-'.join([fy,fm,fd])

ffilter = "%s > '%r'" %(date_field, from_date)
q = q.filter(ffilter)

ОБНОВЛЕНИЕ: цитаты там, где не хватает %r

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