Seite 1 von 1
Sqlite INSERT bei unbekannter Anzahl Werte
Verfasst: Mittwoch 16. März 2011, 14:27
von mc_bongo
Hallo,
ich suche nun vergeblich nach einer Lösung, daher hier meine Frage an euch:
Ich möchte mit Sqlite ein INSERT INTO machen, wobei ich die Anzahl der zu "insertenden" Werte noch nicht weiß.
Wie mache ich so etwas?
Code: Alles auswählen
for e in zeilenwerte:
cursor.execute ('INSERT INTO TabName values(?,?,?,?,)',e)
Mit den Fragezeichen, wie hier kann ich nicht arbeiten, da ja die Anzahl nicht feststeht.
Ich dachte ich könnte irgendwie eine Liste verwenden, komme aber mit dem Syntax nicht klar.
Kann mir jemand einen Tipp geben?
Gruß
Bongo
Re: Sqlite INSERT bei unbekannter Anzahl Werte
Verfasst: Mittwoch 16. März 2011, 14:31
von Hyperion
Ich kapiere da ehrlich gesagt die Frage nicht! Die Anzahl an Attributen ist doch immer gleich - zumindest sollte man diese normaler Weise nicht dauernd ändern, denn das ist Vorarbeit beim DB-Design.
Du kannst doch in SQL die Attributsnamen angeben, die beim Einfügen eines neuen Tupels mit Werten belegt werden sollen:
Code: Alles auswählen
INSERT INTO tabname (attr_a, attr_b, ..., attr_n) values (val_a, val_b, ... val_n);
Re: Sqlite INSERT bei unbekannter Anzahl Werte
Verfasst: Mittwoch 16. März 2011, 14:35
von cofi
Code: Alles auswählen
In [1]: e = range(5)
In [2]: s = "INSERT INTO table values (%s)" % ",".join("?" for _ in e)
In [3]: s
Out[3]: 'INSERT INTO table values (?,?,?,?,?)'
Allerdings muss ich da Hyperion zustimmen, dass du nochmal ueber das Datenbank-Design nachdenken solltest wenn das passiert.
Re: Sqlite INSERT bei unbekannter Anzahl Werte
Verfasst: Mittwoch 16. März 2011, 14:45
von BlackJack
Alternativ:
Code: Alles auswählen
In [672]: 'INSERT INTO table values (%s)' % ','.join('?' * len(e))
Out[672]: 'INSERT INTO table values (?,?,?,?,?)'
Und auch für mich riecht das nach einem Entwurfsfehler.
Re: Sqlite INSERT bei unbekannter Anzahl Werte
Verfasst: Donnerstag 17. März 2011, 17:02
von mc_bongo
Hallo und danke schon mal für die Anworten,
ich werde es mal probieren, wie es BlackJack vorschlägt.
Ich verstehe, dass ihr einen Entwurfsfehler vermutet.
Das Script soll Textdateien in eine DB schreiben. Für die spätere DB enthält jede Textdatei eine Tabelle. Nun möchte ich das Script aber so universell halten, dass ich sowohl 1-spaltige, wie auch 5-spaltige Daten-Dateien in die DB aufnehmen kann, deshalb weiß ich nicht wieviele Attribute kommen.
Für das ALTER TABLE der Spalten war das kein Problem, für die Datensätze stand ich auf dem Schlauch.
Beste Grüße
Bongo
Re: Sqlite INSERT bei unbekannter Anzahl Werte
Verfasst: Donnerstag 17. März 2011, 17:12
von Hyperion
mc_bongo hat geschrieben:
Ich verstehe, dass ihr einen Entwurfsfehler vermutet.
Nach dem was folgt bestärkst Du mich darin auch eher
mc_bongo hat geschrieben:
Das Script soll Textdateien in eine DB schreiben. Für die spätere DB enthält jede Textdatei eine Tabelle. Nun möchte ich das Script aber so universell halten, dass ich sowohl 1-spaltige, wie auch 5-spaltige Daten-Dateien in die DB aufnehmen kann, deshalb weiß ich nicht wieviele Attribute kommen.
Für das ALTER TABLE der Spalten war das kein Problem, für die Datensätze stand ich auf dem Schlauch.
Imho missbrauchst Du mit dem Ansatz eine relationale DB indem Du ihr einen dokumentenzentrierten Ansatz aufflantschst. Ich will Dir da natürlich nicht reinreden - vor allem wo wir keine Details oder Vorgaben kennen - aber evtl. regt es Dich ja noch mal zum Nachdenken an

Für einen grundlegenden Datensatz eine Tabelle zu erstellen mutet auf jeden Fall komisch an.
Re: Sqlite INSERT bei unbekannter Anzahl Werte
Verfasst: Donnerstag 17. März 2011, 17:59
von mc_bongo
Hallo!
Für einen grundlegenden Datensatz eine Tabelle zu erstellen mutet auf jeden Fall komisch an.
Das verstehe ich net?
Also in den Dateien liegen Datensätz, die ebensogut in einer DB stehen könnten.
Also eine Datei pro Tabelle und dann sind darin die Werte.
Ich möchte nun eine DB befüllen, um im Weiteren net immer auf die Dateien zugreifen zu müssen.
Beste Grüße
Bongo
Re: Sqlite INSERT bei unbekannter Anzahl Werte
Verfasst: Donnerstag 17. März 2011, 19:33
von Hyperion
mc_bongo hat geschrieben:Hallo!
Für einen grundlegenden Datensatz eine Tabelle zu erstellen mutet auf jeden Fall komisch an.
Das verstehe ich net?
Also in den Dateien liegen Datensätz, die ebensogut in einer DB stehen könnten.
Also eine Datei pro Tabelle und dann sind darin die Werte.
Ich möchte nun eine DB befüllen, um im Weiteren net immer auf die Dateien zugreifen zu müssen.
Ahso! Na das ist ja auch was anderes. Wenn diese Daten tatsächlich unterschiedliche Interpretationen haben und somit letztlich dem relationalen Modell entsprechen, aber nur auf Dateiebene vorliegen, ist es durchaus etwas anderes.
Allerdings würde ich dann mal vermuten, dass Du kein universelles import-Script schreiben kannst / solltest, da Du doch vermutlich Foreign-Key Beziehungen generieren musst.
Re: Sqlite INSERT bei unbekannter Anzahl Werte
Verfasst: Freitag 18. März 2011, 15:25
von mc_bongo
Hyperion hat geschrieben:mc_bongo hat geschrieben:Hallo!
Für einen grundlegenden Datensatz eine Tabelle zu erstellen mutet auf jeden Fall komisch an.
Das verstehe ich net?
Also in den Dateien liegen Datensätz, die ebensogut in einer DB stehen könnten.
Also eine Datei pro Tabelle und dann sind darin die Werte.
Ich möchte nun eine DB befüllen, um im Weiteren net immer auf die Dateien zugreifen zu müssen.
Ahso! Na das ist ja auch was anderes. Wenn diese Daten tatsächlich unterschiedliche Interpretationen haben und somit letztlich dem relationalen Modell entsprechen, aber nur auf Dateiebene vorliegen, ist es durchaus etwas anderes.
Allerdings würde ich dann mal vermuten, dass Du kein universelles import-Script schreiben kannst / solltest, da Du doch vermutlich Foreign-Key Beziehungen generieren musst.
Ja ich vermute das im Moment auch.
Ich habe nämlich viel zu viel Probleme die z.B Strings uas den Dateien zu parsen und in die Felder zu schreiben.
Ich dachte halt nur, dass ich nicht immer den gleichen Connection Code zur Datenbank; Erstelle Tab, wenn nicht vorhanden; adde Spalten; adde Felder usw. schreiben muss und baue mir eine Funktion, die das für alle Tabelle kann.
Im weiteren Verlauf (wenn die DB einmal besteht) werden nämlich diese Textdateien immer wieder mal eingelesen und die Felder der DB ersetzt.
Aber danke für die Unterstützung. Ich bin schon weiter, wenn nicht diese nervige String-Parserei wäre.
Gruß
Bongo