#python #sql #sqlite #jupyter-notebook #pandasql
#python #sql #sqlite #jupyter-записная книжка #pandasql
Вопрос:
Я работаю в ноутбуках Jupyter, используя pandasql, который использует синтаксис SQLight. Я пытаюсь выбрать записи за определенный месяц, в зависимости от переменной. Я планирую создать функцию Python, которая изменит значение используемой переменной, но прямо сейчас я пытаюсь заставить «Параметризованные запросы» работать.
В моей таблице есть столбцы DATE PAYED, PAYEE, AMOUNT
Вот как выглядит мой SQL-запрос:
varMonth= "01"
q = """
SELECT
*,
strftime('%m', "DATE DUE") as "months"
FROM
year2020
WHERE
"months" = "01"
"""
test2020 = sqldf(q, globals())
Приведенный выше код успешно выбирает все записи с января. Я хочу изменить условие WHERE для сравнения с переменной varMonth
.
Я видел, что существуют разные способы передачи значения в SQL-запросе, например ?, :1, :varMonth, %s, %(varMonth)s, varMonth
, но, похоже, они не работают с моим кодом. При попытке они выдали эту ошибку: PandaSQLException: (sqlite3.ProgrammingError) Incorrect number of bindings supplied. The current statement uses 1, and there are 0 supplied
. Я могу заключить их в кавычки без ошибки, но тогда переменная обрабатывается как строка. Я видел .execute()
(1)(2)как способ передачи переменных запроса, однако, когда я меняю последнюю строку на sqldf.execute(q, [varMonth])
, я получил ошибку AttributeError: 'function' object has no attribute 'execute'
.
Есть какие-нибудь советы о том, как использовать переменные в SQL-запросе в JupyterNotebooks с использованием pandasql?
Комментарии:
1. если нет специального метода для использования переменных, тогда используйте обычный формат строки —
"... {} ....".format(varMonth)
или f-string —f"... {varMonth} ...."
2. Как вы получили
sqldf
? может быть, вы создали функциюsqldf()
, но вы должны создать экземпляр некоторого класса —sqldf = SomeClass()
— и тогда у вас будетsqldf.execute()
.
Ответ №1:
Похоже, что у pandasql и pysqldf нет способа использовать переменные в запросе, как для обычной базы данных, поэтому вам нужно использовать форматирование строки
q = """
SELECT
*,
strftime('%m', "DATE DUE") as "months"
FROM
year2020
WHERE
"months" = "{}"
""".format(varMonth)
или f-строка
q = f"""
SELECT
*,
strftime('%m', "DATE DUE") as "months"
FROM
year2020
WHERE
"months" = "{varMonth}"
"""
Редактировать:
Я проверил исходный код для обоих модулей, и оба используют pandas.read_sql(), который может быть params=(...)
похож на обычную базу данных, но модули ее не используют.
Если вы используете ?
, %s
и т.д., То вы получаете только ошибку, потому что params
это None