Сравнение дат с SQLAlchemy, SQLite

Я пишу приложение, которое использует SQLAlchemy с базой данных SQLite. Я считаю, что моя база данных, таблицы и сопоставление настроены правильно, потому что другие операции работают должным образом. Я пытаюсь написать функцию, которая извлекает все объекты, поле даты которых соответствует параметру datetime.date (), предоставленному в качестве параметра функции. Вот моя первая попытка:

def get_objects_matching_date(session,my_date): return session.query(Table).filter(Table.date_field == my_date).all() 

Событие, хотя я знаю, что Table содержит объекты, соответствующие критериям, функция ничего не возвращает.

Я знаю, что из чтения документации SA, что у sqlite нет встроенной поддержки типов date или datetime и времени, они сохраняются в виде строк. Но SA должна обрабатывать преобразование (при возврате результатов) и из (при вставке записей) объектов date или datetime . Я предполагаю, что он должен иметь возможность справиться с этим при запуске фильтра сравнения. Я прочитал несколько разных потоков SO и рассмотрел возможность использования between() для фильтрации объектов, соответствующих my_date , но это не похоже, что это необходимо, когда точное == – это то, что я ищу. Я также изучил использование .filter(cast(Table.date_field,DATE) == my_date) чтобы гарантировать, что я получаю сравнение объектов, но это, похоже, не работает.

Очевидно, что я пропускаю что-то о том, как SQLAlchemy обрабатывает даты, особенно с базами данных SQLite. Как получить точное соответствие между Date хранящейся в SQLite db, SQLAlchemy и объектом datetime.date() предоставленным в качестве параметра? Спасибо за любую помощь.

2 Solutions collect form web for “Сравнение дат с SQLAlchemy, SQLite”

Это может быть очень поздно, но лучше поздно, чем никогда, так что это может принести пользу другим 🙂

Попробуйте сделать их обоих по дате:

 from sqlalchemy import Date, cast from datetime import datetime created_at = datetime.now().date() query.filter(cast(Model.created_at, Date) == cast(created_at,Date)) 

Проблема действительно заключалась в преобразовании между строками (представление объектов Date в SQLite) и объектах date в python. Решение, похоже, работает очень хорошо, несмотря на довольно долгую последовательность преобразований между типами данных (date-> datetime-> string). Может быть, есть и другой способ, но это работает.

 def get_objects_matching_date(session,my_date): return session.query(Table).\ filter((strftime("%Y-%m-%d",datetime.combine(my_date,time()).timetuple())).all() 
  • Как установить pysqlite?
  • как заставить SQLlite выбрать для поведения транзакции обновления в sqlalchemy
  • Выбор между полкой и sqlite для действительно большого словаря (Python)
  • Эффективность повторного открытия базы данных sqlite после каждого запроса
  • Python / SQLite сохраняет списки как двоичные файлы (blobs)
  • Обновление SQLite3 на моей установке python
  • Работа Django makemigrations работает, миграция завершается неудачей с помощью «django.db.utils.IntegrityError: NOT NULL constraint failed"
  • Вложенные транзакции с SQLAlchemy и sqlite
  • Python - лучший язык программирования в мире.