#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 выглядит, должно быть, более сложным.