Передать аргументы из переменных в 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'>)
В обоих случаях используется привязка параметров, что позволяет защитить запрос от инъекций и упрощает вставку значений в запросы.