Передать аргументы из переменных в 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

→ Ссылка