Ich habe einige Zeit mit dem Lesen der SQLite docs, verschiedene Fragen und Antworten hier auf Stack Overflow und this thing verbracht, aber nicht zu einer vollständigen Antwort gekommen.SQLite einfügen oder ignorieren und original _rowid_
Ich weiß, dass es keine Möglichkeit gibt, so etwas wie INSERT OR IGNORE INTO foo VALUES(...)
mit SQLite zu tun, und der Nummer der ursprünglichen Reihe zurück, und dass in der Nähe von ihm wäre INSERT OR REPLACE
aber das löscht die gesamte Zeile und fügt eine neue Zeile und erhält also eine neue rowid.
Beispieltabelle
CREATE TABLE foo(
id INTEGER PRIMARY KEY AUTOINCREMENT,
data TEXT
);
Im Moment kann ich tun:
sql = sqlite3.connect(":memory:")
# create database
sql.execute("INSERT OR IGNORE INTO foo(data) VALUES(?);", ("Some text.",))
the_id_of_the_row = None
for row in sql.execute("SELECT id FROM foo WHERE data = ?", ("Some text.",)):
the_id_of_the_row = row[0]
Aber etwas ideal würde so aussehen:
the_id_of_the_row = sql.execute("INSERT OR IGNORE foo(data) VALUES(?)", ("Some text",)).lastrowid
Was das Beste ist (sprich: die meisten effiziente Möglichkeit, eine Zeile in eine Tabelle einzufügen und die Zeilennummer zurückzugeben oder die Zeile zu ignorieren, wenn i t existiert schon und bekomme einfach die rowid? Effizienz ist wichtig, weil dies oft passiert.
Gibt es einen Weg zu INSERT OR IGNORE
und gibt die rowid der Zeile zurück, mit der die ignorierte Zeile verglichen wurde? Das wäre toll, denn es wäre genauso effizient wie ein Insert.
Haben Sie 'UPDATE ... WHERE ...' versucht? – Keith