Как вставить переменную в sql запрос на python
Перейти к содержимому

Как вставить переменную в sql запрос на python

  • автор:

Передать аргументы из переменных в SQL-запрос

Таким образом не выходит. И еще подскажите, пожалуйста, в моей таблице есть поле used, в котором по умолчанию во всех записях 0 , мне нужно, чтобы запрос обновлял первую попавшуюся запись, где used равно 0 , а остальные не трогал. Благодарю!

Отслеживать
задан 1 апр 2020 в 0:05
Никита Виноградов Никита Виноградов
121 1 1 золотой знак 1 1 серебряный знак 12 12 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Для конкатенции строки с переменными вы можете использовать один из следующих вариантов:

  • Обычная конкатенция оператором +
  • Форматирования с помощью оператора %
  • Использовать метод format() для строк
  • Использовать f-строки (только для python 3)

Пример с использованием метода .format()

def insertUser(ID, AUTHOR): con = lite.connect("something.db") with con: cur = con.cursor() sql = """UPDATE someth SET used = 1, dis_name = <>, dis_id = <> WHERE used = 0 ORDER BY id ASC LIMIT 1""".format(AUTHOR, ID) cur.execute(sql) 

Для того, чтобы обновить только первую запись, необходимо использовать команду LIMIT с значением 1 вместе ORDER BY (для сортировки по ключевому полю). В примере использована колонка id (как правило, так обозначают в таблицах primary key поля). Если у вас нет такого поля, можете заменить на существующее

UPDATE:

Если вы используете sqlite, скомпилированную без объявления опции

#define SQLITE_ENABLE_UPDATE_DELETE_LIMIT 

То предыдущий код работать не будет, но вы можете реализовать аналог с помощью подзапроса:

def insertUser(ID, AUTHOR): con = lite.connect("something.db") with con: cur = con.cursor() sql = """UPDATE someth SET used = 1, dis_name = <>, dis_id = <> WHERE used = ( SELECT id FROM someth WHERE ORDER BY id ASC LIMIT 1) """.format(AUTHOR, ID) cur.execute(sql) 

Либо перекомпировать sqlite согласно инструкции с включенной опцией SQLITE_ENABLE_UPDATE_DELETE_LIMIT

Как вставить переменную python в sql

Чтобы передать переменную в SQL запрос в Python, вы можете использовать параметризованный запрос. Вот пример:

import mysql.connector mydb = mysql.connector.connect( host="localhost", user="yourusername", password="yourpassword", database="mydatabase" ) mycursor = mydb.cursor() sql = "SELECT * FROM customers WHERE address = %s" adr = ("Yellow Garden 2", ) mycursor.execute(sql, adr) myresult = mycursor.fetchall() for x in myresult: print(x) 

В этом примере мы передаем переменную adr в SQL запрос. Мы используем %s в запросе как заполнитель для нашей переменной. Затем мы передаем нашу переменную в функцию execute() вместе с запросом.

Это позволяет избежать SQL инъекций и делает ваш код более безопасным.

Для более детального изучения вопроса «SQL инъекции» рекомендуем просмотреть урок Безопасность из курса Python: Веб-разработка (Flask)

Вставка переменных в SQL — запрос. Python3

Подскажите плиз, не могу вставить в SQL-запрос значение в двойных кавычках.

Сам запрос выглядит так:

SELECT family,name FROM violations WHERE processing_state = 2 LIMIT AND violations.last_edit BETWEEN "2015-11-01" AND "2015-11-02") 

Попытка вставить в проекте Python

vs = "2015-11-01" vs2 = "2015-11-02" sql=("SELECT family,name FROM violations WHERE processing_state = 2 LIMIT AND violations.last_edit BETWEEN %s AND %s") cur.execute(sql,(vs,vs2)) 

В итоге получаю ошибку вида

\'AND violations.last_edit BETWEEN \'\\"2015-11-01\\"\' AND \'\\"2015-11-02\\"\'\' at line 1'

Уже и в двойный, и в одинарные кавычки пытался заключать переменные vs и vs2, не помогает(

Для коннекта к БД Использую PyMySQL.

Как вставить переменную в sql запрос

Чтобы вставить переменную в SQL-запрос, вам нужно использовать специальный синтаксис в зависимости от типа базы данных.

Например, если вы используете MySQL, то для вставки переменной в запрос можно использовать символ ? , а затем передать значения переменных в запрос с помощью метода execute() :

INSERT INTO mytable (column1, column2, column3) VALUES (?, ?, ?); 

Затем, при выполнении запроса, вы должны передать кортеж значений, содержащий значения для каждой переменной, например:

cursor.execute("INSERT INTO mytable (column1, column2, column3) VALUES (?, ?, ?)", (value1, value2, value3)) 

В других базах данных, таких как PostgreSQL или Oracle, вы можете использовать именованные параметры вместо символа ?. Например:

INSERT INTO mytable (column1, column2, column3) VALUES (:value1, :value2, :value3); 

А затем, при выполнении запроса, вы можете передать словарь, содержащий значения для каждой переменной:

cursor.execute("INSERT INTO mytable (column1, column2, column3) VALUES (:value1, :value2, :value3)", 'value1': 'foo', 'value2': 'bar', 'value3': 'baz'>) 

В обоих случаях используется привязка параметров, что позволяет защитить запрос от инъекций и упрощает вставку значений в запросы.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *