Передать аргументы из переменных в SQL-запрос
Есть таблица, в которой я хочу изменить какую-либо запись:
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' """
cur.execute(sql, (ID, AUTHOR))
Таким образом не выходит. И еще подскажите, пожалуйста, в моей таблице есть поле used, в котором по умолчанию во всех записях 0, мне нужно, чтобы запрос обновлял первую попавшуюся запись, где used равно 0, а остальные не трогал.
Благодарю!
Ответы (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 id = 0
ORDER BY id ASC
LIMIT 1)
""".format(AUTHOR, ID)
cur.execute(sql)
Либо перекомпировать sqlite согласно инструкции с включенной опцией SQLITE_ENABLE_UPDATE_DELETE_LIMIT