Usted podría utilizar INSERT OR REPLACE para actualizar filas con una restricción única , o INSERT OR IGNORE ignorar insertos que estén en conflicto con una restricción única:
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()
Estos comandos sqlite son probablemente más rápido que escribir código Python a hacer lo mismo, aunque a probar esta se podría utilizar el módulo de Python timeit
para probar la velocidad de var implementaciones religiosas Por ejemplo, podría ejecutar
python -mtimeit -s'import test' 'test.insert_or_replace()'
frente
python -mtimeit -s'import test' 'test.filter_nonunique_rows_in_Python()'
frente
python -mtimeit -s'import test' 'test.insert_with_try_catch_blocks()'
Gracias. ¿Es esto más eficiente que probar en python como el punto 1? Para mi situación, 'insertar o ignorar' es ideal. – xralf
@xralf: sqlite está escrito en C, por lo que permitir que sqlite realice el filtrado es más probable que escribir su propio código para hacer lo mismo en Python. (Incluso si el código Python fuera tan rápido como el código C, igual tendría que cargar toda la tabla en un objeto de Python ...) Sin embargo, como usted preguntó cómo probar esta afirmación, sugerí usar 'python -mtimeit ... '. – unutbu