Переменные в SQLITE Python

#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