Seite 1 von 1

Delete where in liste -> too many SQL variables

Verfasst: Mittwoch 25. Mai 2011, 12:05
von p90
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.

Re: Delete where in liste -> too many SQL variables

Verfasst: Mittwoch 25. Mai 2011, 12:12
von 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.

Re: Delete where in liste -> too many SQL variables

Verfasst: Mittwoch 25. Mai 2011, 13:54
von p90
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.