Страницы

Поиск по вопросам

пятница, 24 января 2020 г.

Как создать проверку на существование записи?

#python #sqlite


проверять нужно в базе данных user_id, product_id, voice если они совпадают со значениями
в переменой, тогда не будем добавлять, а если не совпадает лишь значения voice тогда
перезаписать его

def add_rating(user_id, product_id, voice):
    conn = sqlite3.connect('db.sqlite')
    c = conn.cursor()
    c.execute("INSERT INTO User (user_id, product_id, voice) VALUES("+ user_id +","+product_id+",
"+voice+")")
    conn.commit()
    conn.close()

    


Ответы

Ответ 1



Чтобы обновить значение voice, относящееся к заданной паре (user_id, product_id) или добавить новую запись, если подобной пары ещё нет в таблице, можно использовать INSERT OR REPLACE как показано в ответе @gaspard, к похожему вопросу INSERT IF NOT EXISTS ELSE UPDATE? В случае конфликта, если запись с парой user_id, product_id уже существует, то она будет удалена и вставка происходит в любом случае (поэтому, если запись уже существует, то поля, неуказанные в запросе, могут быть заменены на значение по умолчанию, например, NULL—смотри описание алгоритма разрешения конфликтов REPLACE): #!/usr/bin/env python import sqlite3 c = sqlite3.connect(':memory:') c.executescript(''' CREATE TABLE User (user_id INTEGER UNIQUE, product_id INTEGER UNIQUE, voice real); CREATE UNIQUE INDEX voice_idx ON User(user_id, product_id); ''') c.executemany('INSERT OR REPLACE INTO User VALUES(?,?,?)', [(1, 2, 3), (2, 3, 3), (1, 2, 5)]) print(list(c.execute("SELECT * FROM User"))) Результат [(2, 3, 3.0), (1, 2, 5.0)] Видно, что первая запись (1,2,3) была автоматически удалена и замещена записью (1,2,5). В случае, если в таблице есть другие поля, значения которых хочется сохранить, то можно использовать подход из ответа @Chris Stavropoulos к вопросу SQLite - UPSERT not INSERT or REPLACE: #!/usr/bin/env python import sqlite3 c = sqlite3.connect(':memory:') c.executescript(""" CREATE TABLE User (user_id INTEGER UNIQUE, product_id INTEGER UNIQUE, voice real, name text); CREATE UNIQUE INDEX voice_idx ON User(user_id, product_id); INSERT INTO User values(1, 2, 3, 'abc'); """) for values in [(2, 3, 3), (1, 2, 5)]: with c: cur = c.execute('INSERT OR IGNORE INTO User(user_id, product_id, voice) ' 'values(?, ?, ?)', values) if cur.rowcount == 0: # already exists data = dict(zip("user_id product_id voice".split(), values)) cur.execute('update User set voice=:voice ' 'where user_id=:user_id and product_id=:product_id', data) print(list(c.execute("SELECT * FROM User"))) c.close() Результат [(1, 2, 5.0, 'abc'), (2, 3, 3.0, None)] Видно, что значение name 'abc' было сохранено при обновлении voice на 5.0. UPSERT возможно будет встроен в SQLite, начиная с версии 3.24 как ON CONFLICT условие в INSERT запросе (не тестировано): c.execute('INSERT INTO User VALUES(:user_id, :product_id, :voice)' ' ON CONFLICT(user_id, product_id) DO UPDATE SET voice=:voice', dict(user_id=1, product_id=2, voice=8))

Комментариев нет:

Отправить комментарий