Вы можете использовать INSERT OR REPLACE , чтобы обновить строки с уникальным ограничением,
или INSERT OR IGNORE , чтобы игнорировать вставки, конфликтующие с уникальным ограничением:
import sqlite3
def insert_or_replace():
# https://sqlite.org/lang_insert.html
connection=sqlite3.connect(':memory:')
cursor=connection.cursor()
cursor.execute('CREATE TABLE foo (bar INTEGER UNIQUE, baz INTEGER)')
cursor.execute('INSERT INTO foo (bar,baz) VALUES (?, ?)',(1,2))
cursor.execute('INSERT OR REPLACE INTO foo (bar,baz) VALUES (?, ?)',(1,3))
cursor.execute('SELECT * from foo')
data=cursor.fetchall()
print(data)
# [(1, 3)]
def on_conflict():
# https://sqlite.org/lang_insert.html
connection=sqlite3.connect(':memory:')
cursor=connection.cursor()
cursor.execute('CREATE TABLE foo (bar INTEGER UNIQUE, baz INTEGER)')
cursor.execute('INSERT INTO foo (bar,baz) VALUES (?, ?)',(1,2))
cursor.execute('INSERT OR IGNORE INTO foo (bar,baz) VALUES (?, ?)',(1,3))
cursor.execute('SELECT * from foo')
data=cursor.fetchall()
print(data)
# [(1, 2)]
insert_or_replace()
on_conflict()
Эти команды sqlite, вероятно, быстрее, чем написание кода Python, чтобы сделать то же самое, хотя для проверки этого вы можете использовать модуль timeit
Python для проверки скорости различных реализаций. Например, вы можете запустить
python -mtimeit -s'import test' 'test.insert_or_replace()'
против
python -mtimeit -s'import test' 'test.filter_nonunique_rows_in_Python()'
против
python -mtimeit -s'import test' 'test.insert_with_try_catch_blocks()'