Как вставить значение в таблицу или обновить его, если оно уже есть в таблице - PullRequest
1 голос
/ 20 октября 2019

Я настраиваю базу данных с двумя полями, user_id и count, и я хочу иметь возможность вставить эту пару значений или счетчик приращений на 1, если запись с тем же user_id уже есть в таблице.

Я уже перепробовал много решений, например, INSERT INTO ... ON DUPLICATE KEY UPDATE ..., но они не работают для меня. Выдает ошибку, которая говорит:

sqlite3.OperationalError: near "ON": syntax error

Я использую SQLite 3.21.0 на Python 3.7.

У меня есть такой код:

def add_warning(id):
    sql = f"""INSERT INTO warnings (user_id, count) VALUES({id}, 1) ON CONFLICT(user_id) DO UPDATE SET count=count+1"""
    cursor.execute(sql)

Iожидайте обновления значения счетчика при выполнении запроса, но он выдает ошибку, когда я пытаюсь это сделать.

Ответы [ 3 ]

3 голосов
/ 20 октября 2019

Предполагая, что user_id - это primary key таблицы, которую вы можете использовать (INSERT OR) REPLACE:

sql = "REPLACE INTO warnings (user_id, count) VALUES(?, COALESCE((SELECT count + 1 FROM warnings WHERE user_id = ?), 1))"
cursor.execute(sql1, (id, id,))

См. Демонстрационную версию .

2 голосов
/ 20 октября 2019

Синтаксис upsert, который вы пытаетесь использовать, поддерживается только в версиях SQLite 3.24.0 или новее. Это объясняет, почему ваш код не работает, и вот обходной путь:

sql1 = "INSERT OR IGNORE INTO warnings (user_id, count) VALUES (?, 0)"
cursor.execute(sql1, (id,))
sql2 = "UPDATE warnings SET count = count + 1 WHERE user_id = ?"
cursor.execute(sql2, (id,))

Логика здесь заключается в том, чтобы сделать начальную вставку пользовательской записи с нулевым счетом только , если этопользователь еще не найден. Затем мы всегда обновляем счет на единицу независимо от того, что.

0 голосов
/ 22 октября 2019

Вы также можете попробовать это. Это работает на SQL Server, но я не пробовал это на SQLite

sql = "IF EXISTS (select user_id FROM warnings WHERE user_id={0}) " + \
"BEGIN " + \
"UPDATE warnings SET count = count + 1  WHERE user_id={0} " + \
"END " + \
"ELSE " + \
"INSERT INTO warnings (user_id, count) VALUES ({0}, 0 )".format(id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...