Как использовать ядро ​​Sqlalchemy с текстом sql для диапазона дат? - PullRequest
0 голосов
/ 04 июня 2018
s = text('SELECT customers.id,WHERE customers.end_date IS NULL or customers.end_date >= '+ "2018-05-01"+ 'AND customers.end_date <='+"2018-05-31" + 'ORDER BY customers.id;')

Это вызывает синтаксические ошибки.Как именно передать значения даты в приведенном выше утверждении?Как оформить строку даты?Использование sqlalchemy core только версия 1.0.8, python 2.7

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

Будьте осторожны при объединении строк, вы можете пропустить некоторые пробелы.Например: "2018-05-01"+ 'AND customers.end_date <=' => "2018-05-01AND customers.end_date <='.И т.д.

Другая вещь - это добавление кавычек вокруг даты внутри запроса.В вашем случае цитаты вокруг не являются частью запроса.Таким образом, вы могли бы написать вместо: "'2018-05-01'"+ ' AND customers.end_date <='.

или посмотреть полный пример по @ Dataichou

0 голосов
/ 04 июня 2018

Есть несколько потенциальных синтаксических ошибок.Первая - это дополнительная запятая в конце списка элементов 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''')
0 голосов
/ 04 июня 2018

попробуйте это:

    s = text('SELECT customers.id WHERE customers.end_date IS NULL or 
   customers.end_date >= \'2018-05-01\' AND customers.end_date 
    <= \'2018-05-31\' ORDER BY customers.id;')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...