[gelöst] TypeError: not all arguments converted during...

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Hallo Leute,

bin ziemlich ratlos. Habe ein Skript, welches auch schon funktionierte. Leider musste ich hinterher noch Änderung an der Datenbank vornehmen, Spalten Hinzufügen und und Inhalt der Spalten ist ein wenig anders. Meine ID Spalten sind nun CHAR und keine INT mehr, aber alles egal. Hab ich auch geändert und erstelle nun die Datenbank (ist eh alles noch in der Testphase) neu. Wollte dmait nur sagen, dass das Skript schon funktionierte.

Die Inhalte der Tabellen der Datenbank (zumindest ein Teil) liegt in Form von CSVs vor und die müssen NUR eingelesen werden. Für 2 Tabellen funktioniert das auch, für die 3. nicht. Kommt oben genannte Fehlermeldung.

Ich hab mir alles genau angeschaut, weil diese Fehlermeldung hatte ich davor auch schon mal, da endete jede Zeile in der csv mit dem Trennzeichen. Hatte es weggenommen und hatte danach dann keine Probleme mehr.

Hier die Ausschnitte aus dem Code:

Erstellen der Tabelle (funktioniert)

Code: Alles auswählen

indizes = 'create table IF NOT EXISTS Indikatoren (ID CHAR(5) PRIMARY KEY,\
                                                kat CHAR(2),\
                                                CALC_CAT CHAR(2),\
                                                NAME VARCHAR(250),\
                                                Berechnung VARCHAR(250),\
                                                Einheit Varchar(6),\
                                                FOREIGN KEY(kat) REFERENCES \
                                                Kategorien(KAT) \
                                                ON DELETE CASCADE)\
                                                ENGINE = InnoDB'                                                       
cursor.execute(indizes)
"Fülllen der Tabelle"

Code: Alles auswählen

def fill_tables(f, fill):
  reader_csv = csv.reader(f, delimiter=';')
  fill[1](reader_csv)

def indicators(reader_csv):
  try:   
    cursor.executemany('INSERT INTO Indikatoren(\
                        ID,kat,CALC_CAT,NAME,Berechnung,Einheit)\
                        values(%s,%s,%s,%s,%s)', 
                        reader_csv)
    db.commit()
  except MySQLdb.IntegrityError:
        print "Eintrag gibt es schon"

#----------------
f = file(csv_file)
fill_tables(f,fill)
Hatte dann schon Probehalber mal jede Zeile einzeln eingelesen, und nicht mit executemany. Vor dem Einlesen habe ich mir dann jede ZEile einzeln ausgeben lassen. Diese Zeile (es brach sofort ab) sah so aus:

Code: Alles auswählen

['X1Y', 'Z', 'X', 'Flache in ha', 'Flache 1234', 'ha']
Ich nehme an, es ist nur wieder irgendein ganz einfacher Schusselfehler, den ich nicht sehe...ich suche inzwischen aber schon wieder eine Stunde :(
Zuletzt geändert von meneliel am Montag 11. Februar 2008, 11:29, insgesamt 1-mal geändert.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

ARGGGGGGGGGGGGG .... gepostet und 15 sek später den Fehler gefunden....

Code: Alles auswählen

cursor.executemany('INSERT INTO Indikatoren(\
                        ID,kat,CALC_CAT,NAME,Berechnung,Einheit)\
                        values(%s,%s,%s,%s,%s;%s)',
                        reader_csv)
Muss es heißen ... da fehlte nur ein %s .... *grml*
Antworten