Liste in einen Table einfügen?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
FrostByteGER
User
Beiträge: 29
Registriert: Mittwoch 25. April 2012, 16:11

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

`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:

Code: Alles auswählen

(item,) # <- beachte das Komma!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
FrostByteGER
User
Beiträge: 29
Registriert: Mittwoch 25. April 2012, 16:11

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()
Zuletzt geändert von FrostByteGER am Donnerstag 7. Juni 2012, 14:51, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
FrostByteGER
User
Beiträge: 29
Registriert: Mittwoch 25. April 2012, 16:11

Jo stimmt, gefixt. Danke :D

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
FrostByteGER
User
Beiträge: 29
Registriert: Mittwoch 25. April 2012, 16:11

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?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Poste doch mal die exakte Fehlermeldung und was sich in `self.customernumbers` wirklich befindet. Ohne das kann man wenig dazu sagen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
FrostByteGER
User
Beiträge: 29
Registriert: Mittwoch 25. April 2012, 16:11

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',[...]
BlackJack

@FrostByteGER: Es ist das selbe Problem wie vorher. `executemany()` möchte ein Iterable von Elementen haben, die man `execute()` übergeben könnte…
FrostByteGER
User
Beiträge: 29
Registriert: Mittwoch 25. April 2012, 16:11

Yo glatt vergessen, hier die gefixte:

Code: Alles auswählen

        self.numcur.executemany("INSERT INTO Numbers VALUES(?)",tuple(self.customernumbers))
Danke, funzt alles einwandfrei :D
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.
FrostByteGER
User
Beiträge: 29
Registriert: Mittwoch 25. April 2012, 16:11

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^^
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.
FrostByteGER
User
Beiträge: 29
Registriert: Mittwoch 25. April 2012, 16:11

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".
Antworten