Вы смешиваете синтаксис Python в свой SQL-запрос.SQL анализируется и выполняется базой данных, а не Python, и база данных ничего не знает о datetime.datetime.now()
или datetime.date()
или timedelta()
!Конкретная ошибка, которую вы видите, вызвана тем, что ваш код Python интерпретируется как SQL, а как SQL , datetime.datetime.now
ссылается на столбец now
таблицы datetime
в базе данных datetime
, котораяперекрестная ссылка на базу данных, и psycopg2
не поддерживает запросы, которые включают несколько баз данных.
Вместо этого используйте Параметры SQL для передачи значений из Python в базу данных.Используйте заполнители в SQL, чтобы показать драйверу базы данных, куда должны идти значения:
params = {
# all rows after this timestamp, 7 days ago relative to 'now'
'earliest': datetime.datetime.now() - datetime.timedelta(days=7),
# if you must have a date *only* (no time component), use
# 'earliest': datetime.date.today() - datetime.timedelta(days=7),
}
df = pd.read_sql("""
select store_name,count(*) from sales
where created_at >= %(latest)s""", params=params, con=con)
Используются заполнители, как определено в psycopg2
документации параметров , где %(latest)s
относится кключ latest
в словаре params
.datetime.datetime()
экземпляры напрямую поддерживаются драйвером.
Обратите внимание, что я также исправил выражение 7 дней назад , и заменили синтаксис BETWEEN
на >=
;без второй даты вы не запрашиваете значения между двумя датами, поэтому используйте >=
, чтобы ограничить столбец датами после или после указанной даты.