Вы можете запустить SQL для своего экземпляра SQLite вместо Python. Таким образом, легче найти проблему с оператором SQL - на один уровень меньше.
Я вижу потенциальную проблему с синтаксисом вашего запроса. Когда используется {country}
, то Python помещает Canada
, Poland
в качестве строки. Однако SQLite ожидает значение, которое должно быть 'Canada'
, 'Poland'
.
Кроме того, что оператор IN
проверяет, существует ли поле в предоставленном списке - поэтому вам нужно (
, )
- для построения списка с одним элементом. Лучший оператор здесь =
.
Если я касаюсь операторов ... Пожалуйста, прочитайте о BETWEEN
здесь .
След. Я не уверен, что хранится в from_date
/ to_date
столбцах. Пожалуйста, прочитайте Документы SQLite , чтобы убедиться, что он используется правильно.
Итак, с предлагаемыми изменениями я хотел бы видеть:
sql = f"""SELECT *
FROM table
WHERE country_col = '{country}'
AND name_col = '{name}'
AND date(date_col) BETWEEN '{from_date}' AND '{to_date}'"""
Обновление
Передать массив. Давайте начнем с basi c SQL:
выберите * из таблицы, где страна_кол в ('Польша', 'Канада', 'Германия')
Чтобы узнать больше, отметьте этот сайт. Просто помните, что строка должна быть окружена '
. Иногда это может быть также "
, но для PostgreSQL "col"
- означает имя столбца col
, а 'col'
означает строку col
. Итак, ваш оператор IN
был правильным!
Теперь с Python - вам нужно подготовить строку с названиями стран, каждая из которых будет окружена '
:
countries = ['Poland', 'Germany', 'France']
param = ", ".join([f"'{x}'" for x in countries])
join
объединяет строки из переданного списка, внутреннее понимание добавляет '
к каждому элементу списка.
Вместе:
countries = ['Poland', 'Germany', 'France']
param = ", ".join([f"'{x}'" for x in countries])
sql = f"""SELECT *
FROM table
WHERE country_col in ({param})'
AND name_col = '{name}'
AND date(date_col) BETWEEN '{from_date}' AND '{to_date}'"""