Delete where in liste -> too many SQL variables

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,

verwende sqlite um mir Messdaten wegzuspeichern.
Dazu habe ich eine Tabelle mit:
(path TEXT, filename TEXT, mode TEXT, value REAL)

Nun möchte ich alle Einträge löschen die path = path haben und deren filename nicht in der Liste Filenames vorkommen.
Dazu versuche ich dies hier:

Code: Alles auswählen

path = blaha
if len(filenames) == 0:
    sql = "DELETE FROM data WHERE path=?"
    con.execute(sql, (path,))
else:
    sql = "DELETE FROM data WHERE path=? AND NOT filename IN (" + "?," * (len(filenames) -1 ) + "?)"
    args = (path, filenames)
    con.execute(sql, args)
Nur ist len(filenames) so was um die 100000.

Zur Motivation:
Meine Messwerte liegen als einzelne csv Dateien vor, die eine ganze Waveform darstellen. Aus jeder Waveform extrahiere ich einen Datenpunkt.
Diesen möchte ich in einer DB zwischen speichern. Wird die csv-Datei verschoben oder entfernt soll er die Daten aus der DB löschen.
Deshalb gehe ich mit os.walk durch die Verzeichnisse und sehe nach welche Dateien noch da sind und welche nicht.
Dann entferne ich alle Daten in der DB die keine csv-Datei mehr haben.
BlackJack

@p90: Solche Datenmengen gehören ja auch nicht in eine SQL-Abfrage. So eine Datenmenge variabler Grösse ist selbst schon wieder eine Spalte in der Datenbank wert. Du könntest eine Tabelle dafür anlegen, die Namen dort hinein lesen und dann die Abfrage statt mit ``IN`` und Werten in der Abfrage mit einer Unterabfrage auf die Tabelle mit den Namen machen.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hm, okay.
Das mit der zweiten Tabelle könnte ich machen, habe es jetzt aber mit sets iny python gelöst.
Muss ich zwar etwas mehr in der DB lesen aber von dem was ich gesehen habe ist es dafür ne ganze ecke schneller.
Antworten