преобразование выбранного datetime в date в sqlalchemy

#python #postgresql #sqlalchemy

#python #sqlalchemy

Вопрос:

У меня есть база данных тестовых записей с одним столбцом ‘test_time’, определенным как datetime. Я хочу запросить, сколько существует различных дат, поскольку я хочу выгрузить результаты теста в csv в соответствии с датами. Теперь у меня есть следующее:

 distinct_dates = list(session.query(Test_Table.test_time).distinct())
  

Но это дает мне список datetime, а не date. Конечно, я могу преобразовать это в Python, но когда я использую sqlite. Я сделал это SELECT DISTINCT DATE(test_time) FROM Test_Table . Я не могу придумать эквивалент в sqlalchemy.

Ответ №1:

Это было бы с помощью cast() выражения:

 from sqlalchemy import cast, Date

distinct_dates = session.query(cast(Test_Table.test_time, Date)).distinct().all()
  

или метод быстрого доступа:

 distinct_dates = session.query(Test_Table.test_time.cast(Date)).distinct().all()
  

и если вы используете SQLite, попробуйте это:

 distinct_dates = session.query(func.DATE(Test_Table.test_time)).distinct().all()
  

Комментарии:

1. Не глядя на исходный код, я бы предположил, что в конечном итоге используется выражение DATE () в sql … есть вероятность, что оно этого не делает, но я верю в sqlalchemy.

2. Я пробовал cast раньше. Но sqlalchemy всегда выдает мне это исключение: ValueError: Couldn't parse date string '2013' - value is not a string.

3. Однако, если я выполню необработанный запрос SELECT DISTINCT DATE(test_table.test_time) AS test_date FROM test_table , он выдаст мне целые даты. В этой ссылке говорилось о странности преобразования sqlite datetime в date.

4. нет проблем, рад, что смог помочь! sqlalchemy очень хорошо продумана, если бы только их документация была немного лучше!

5. Действительно, верно. Я новичок в SQL и даже новее в sqlalchemy. Но обычно я могу найти выход в SQL. sqlalchemy выглядит, должно быть, более сложным.