Seite 1 von 1
Liste in einen Table einfügen?
Verfasst: Donnerstag 7. Juni 2012, 13:53
von FrostByteGER
Moin,
ja mal wieder ich xD
Folgendes Problem: Ich kann keine Elemente einer Liste zu meinem Table hinzufügen.
Der Code:
Code: Alles auswählen
def createNumberDB(self):
customergen = custgen.CustomerGen()
self.customernumbers = customergen.SQLCustomergenerator()
self.numcur.execute("""CREATE TABLE Numbers (Customernumbers TEXT)""")
self.connection.commit()
for item in self.customernumbers:
# print item
self.numcur.execute("INSERT INTO Numbers VALUES(?)",item)
self.connection.commit()
Die Fehlermeldung:
Code: Alles auswählen
self.numcur.execute("INSERT INTO Numbers VALUES(?)",item)
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 11 supplied.
DIe Listenelemente besteht aus Alphanumerischen Zeichen und es sind ca. 1000 Elemente insgesamt. Ich hab gegoogelt und getestet, aber es will partou nicht funktionieren. Warum meint SQLite, dass es 11 sind? Es ist doch nur ein Listenelement? Er nimmt aber die einzelnen Buchstaben.
Langsam geht mit SQL ziemlich auf den Sack xD
Kann mir jemand helfen?
Re: Liste in einen Table einfügen?
Verfasst: Donnerstag 7. Juni 2012, 14:01
von Hyperion
`execute` erwartet ein Iterable; ein String ist bereits ein Iterable... daher werden die einzelnen Buchstaben ausgewertet. Du musst das ganze als ein Element eines anderen Iterables übergeben, etwa einem Tupel mit *einem* Element:
Re: Liste in einen Table einfügen?
Verfasst: Donnerstag 7. Juni 2012, 14:11
von FrostByteGER
Edit: fertige Lösung gefixt!
Code: Alles auswählen
for item in self.customernumbers:
self.numcur.execute("INSERT INTO Numbers VALUES(?)",(item,))
self.connection.commit()
Re: Liste in einen Table einfügen?
Verfasst: Donnerstag 7. Juni 2012, 14:23
von Hyperion
FrostByteGER hat geschrieben:Ahhh verstehe. Habs mithilfe eines puffers gelöst:
Öh... Du bindest das lediglich (umständlich) an einen neuen Namen - Puffer würde ich dazu nicht sagen

Du kannst das Tupel doch direkt in `execute` erstellen! Das ist im übrigen auch der Weg, den die Doku vom SQLite3 Modul anbietet iirc.
Re: Liste in einen Table einfügen?
Verfasst: Donnerstag 7. Juni 2012, 14:50
von FrostByteGER
Jo stimmt, gefixt. Danke
Ich steh echt auf Kriegsfuß mit SQL xD
edit: Allerdings ist die Methode ziemlich lahm bei größeren Listen. Gibts ne Methode um das zu vereinfachen?
Re: Liste in einen Table einfügen?
Verfasst: Donnerstag 7. Juni 2012, 15:21
von Hyperion
Du commitest nach jeder Einfügeoperation... da sollte der Bottleneck sein. Mache das erst nach der Schleife.
Zudem könntest Du Dir mal `executemany` angucken - das spart die Schleife...
Re: Liste in einen Table einfügen?
Verfasst: Donnerstag 7. Juni 2012, 15:30
von FrostByteGER
Hab executemany mal getestet, allerdings kommt dann wieder das Problem mit dem iterieren!
Code:
Code: Alles auswählen
self.numcur.executemany("INSERT INTO Numbers VALUES(?)",self.customernumbers)
self.connection.commit()
Wie soll das denn dann aussehen?
Re: Liste in einen Table einfügen?
Verfasst: Donnerstag 7. Juni 2012, 16:36
von Hyperion
Poste doch mal die exakte Fehlermeldung und was sich in `self.customernumbers` wirklich befindet. Ohne das kann man wenig dazu sagen.
Re: Liste in einen Table einfügen?
Verfasst: Donnerstag 7. Juni 2012, 18:40
von FrostByteGER
Yo sry:
Hier die Fehlermeldung:
Code: Alles auswählen
Traceback (most recent call last):
File "C:\Users\Kevin\Desktop\Daten\Eclipse\Workspace\Python - Bankklasse ARTEMIS\src\Artemis_Database.py", line 160, in <module>
main.checkNumdb()
File "C:\Users\Kevin\Desktop\Daten\Eclipse\Workspace\Python - Bankklasse ARTEMIS\src\Artemis_Database.py", line 125, in checkNumdb
self.createNumberDB()
File "C:\Users\Kevin\Desktop\Daten\Eclipse\Workspace\Python - Bankklasse ARTEMIS\src\Artemis_Database.py", line 131, in createNumberDB
self.createNumberTable()
File "C:\Users\Kevin\Desktop\Daten\Eclipse\Workspace\Python - Bankklasse ARTEMIS\src\Artemis_Database.py", line 140, in createNumberTable
self.numcur.executemany("INSERT INTO Numbers VALUES(?)",self.customernumbers)
sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 11 supplied.
Das dazugehörige Codefragment:
Code: Alles auswählen
self.numcur.executemany("INSERT INTO Numbers VALUES(?)",self.customernumbers)
self.connection.commit()
Ausschnitt des Inhalts von self.customernumbers:
Code: Alles auswählen
['DE40RCQ8000', 'DE35JRL3001', 'DE90QMN7002', 'DE93IGK5003', 'DE28LDS1004', 'DE39AAW8005', 'DE15FLF3006', 'DE34CVP2007',[...]
Re: Liste in einen Table einfügen?
Verfasst: Donnerstag 7. Juni 2012, 19:07
von BlackJack
@FrostByteGER: Es ist das selbe Problem wie vorher. `executemany()` möchte ein Iterable von Elementen haben, die man `execute()` übergeben könnte…
Re: Liste in einen Table einfügen?
Verfasst: Freitag 8. Juni 2012, 11:37
von FrostByteGER
Yo glatt vergessen, hier die gefixte:
Code: Alles auswählen
self.numcur.executemany("INSERT INTO Numbers VALUES(?)",tuple(self.customernumbers))
Danke, funzt alles einwandfrei

Re: Liste in einen Table einfügen?
Verfasst: Freitag 8. Juni 2012, 14:17
von BlackJack
@FrostByteGER: Das kann nicht sein. Ob Du eine Liste mit Elementen übergibst die nicht als Argumente taugen oder ein Tupel mit den selben untauglichen Argumenten, macht keinen Unterschied.
Re: Liste in einen Table einfügen?
Verfasst: Dienstag 19. Juni 2012, 12:04
von FrostByteGER
Was soll ich denn dann machen, weil jetzt bin ich etwas verwirrt. Also funktionieren tut es soweit, deswegen wundert mich das jetzt. Warum untaugliche Argumente? Was soll ich denn dann übergeben?
Und sry, dachte die Sache wäre damit gegessen^^
Re: Liste in einen Table einfügen?
Verfasst: Dienstag 19. Juni 2012, 22:30
von BlackJack
@FrostByteGER: Wenn Du ausser dem gezeigten nicht noch etwas anderes geändert hast, nämlich den Inhalt von `self.customernumbers` dann muss mit oder ohne das `tupel()` die gleiche Fehlermeldung kommen.
Re: Liste in einen Table einfügen?
Verfasst: Mittwoch 20. Juni 2012, 11:03
von FrostByteGER
Die Inhalte sind immer noch ca. 1000 Listenelemente! Ich habs halt nur zu nem Tuple gemacht. Keine Fehlermeldung. Die Datenbank bzw. der Table wurde korrekt "befüllt".