Есть несколько потенциальных синтаксических ошибок.Первая - это дополнительная запятая в конце списка элементов SELECT перед предложением WHERE.Вторая (и третья) пропущенные кавычки вокруг литерала, с которым вы сравниваете.Недостающие пробелы также изменяют способ анализа запроса.После объединения строк результат выглядит следующим образом:
In [2]: s
Out[2]: 'SELECT customers.id,WHERE customers.end_date IS NULL or customers.end_date >= 2018-05-01AND customers.end_date <=2018-05-31ORDER BY customers.id;'
, что явно неверно.
Как всегда, не передавайте значения в запросы SQL с конкатенацией или форматированием строк, если они не являются статическими, в этом случае они являются частью вашего запроса для начала.Если вы это сделаете, вы можете подвергнуть себя SQL-инъекции .Драйвер, который вы используете, знает, как обрабатывать различные типы данных, цитирование и т. Д. Лучше, чем вы - возможно.Используйте заполнители:
s = text('''SELECT customers.id
WHERE customers.end_date IS NULL
OR customers.end_date >= :end_date_low
AND customers.end_date <= :end_date_high
ORDER BY customers.id''')
low = "2018-05-01"
high = "2018-05-31"
# engine, connection, or session
conn.execute(s, end_date_low=low, end_date_high=high)
Кроме того, вы можете использовать оператор SQL МЕЖДУ здесь:
s = text('''SELECT customers.id
WHERE customers.end_date IS NULL
OR customers.end_date BETWEEN :end_date_low AND :end_date_high
ORDER BY customers.id''')