Problem mit INSERT

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
snatch
User
Beiträge: 25
Registriert: Sonntag 20. August 2006, 01:49

Hallo,
ich bekomme bei folgendem Code

Code: Alles auswählen

  def write_to_db(self, host = '', db = '', user = '', passwd = ''):
    db = MySQLdb.connect(host="localhost",db="test",user="root")
    cursor = db.cursor()
    csv_data = self.read_csv(read_first_line = 0)
    for i in range(len(csv_data)):
      datum = csv_data[i][0].split('.')
      cursor.execute('SELECT web_id FROM open_web WHERE date = %s', datum[2]+'-'+datum[1]+'-'+datum[0])
      result = cursor.fetchall()
      
      if not result:
        cursor.execute('INSERT INTO open_web SET date = %s', datum[2]+'-'+datum[1]+'-'+datum[0])
      
    for j in range(len(csv_data)):
      datum = csv_data[j][0].split('.')
      cursor.execute('SELECT web_id FROM open_web WHERE date = %s', datum[2]+'-'+datum[1]+'-'+datum[0])
      result = cursor.fetchone()
      print type(csv_data[j][1])
      if result:
        cursor.execute("""INSERT INTO open_web_data 
                          SET
                            web_id = %s,
                            time = %s,
                            temp_i = %f;""", (result, csv_data[j][1], float(csv_data[j][2])))
ständig folgende Fehlermeldung

Code: Alles auswählen

Traceback (most recent call last):
 File "D:\Daten\Python\Import\Import.py", line 74, in 
wi.write_to_db()
 File "D:\Daten\Python\Import\Import.py", line 69, in write_to_db
temp_i = %f;""", (result, csv_data[j][1], float(csv_data[j][2])))
 File "C:\Programme\Python25\Lib\site-packages\MySQLdb\cursors.py", line 148, in execute
query = query % db.literal(args)
TypeError: float argument required
Ich bin schon länger am rumprobieren und am suchen, aber ich weis ich weis einfach nicht wie dieser Fehler entsteht und wie ich ihm entgegenwirken kann.
Ich verstehe einfach nicht was an dem INSERT Befehl falsch sein soll.
Was auch komisch ist, ist das wenn ich die Einträge für time und temp_i aus dem INSERT Befehl raus nehme, also nur die web_id drinne lasse, der Befehl funktioniert.
Über hilfe wäre ich sehr dankbar.

mfg
snatch
BlackJack

Das '%f' in der SQL-Anweisung muss auch ein '%s' sein. Das ist keine Zeichenkettenformatierung mit dem ``%`` Operator, sondern eine Ersetzung, die das Datenbankmodul vornimmt!

Ist IMHO sehr unglücklich gewählt, dass die gleichen Platzhalter wie bei Zeichenkettenformatierung benutzt werden.
snatch
User
Beiträge: 25
Registriert: Sonntag 20. August 2006, 01:49

BlackJack hat geschrieben:Das '%f' in der SQL-Anweisung muss auch ein '%s' sein. Das ist keine Zeichenkettenformatierung mit dem ``%`` Operator, sondern eine Ersetzung, die das Datenbankmodul vornimmt!

Ist IMHO sehr unglücklich gewählt, dass die gleichen Platzhalter wie bei Zeichenkettenformatierung benutzt werden.
Nun benutze ich überall %s und bekomme nun einen SQL Error. Ich verstehe aber nicht warum.
Hier der Code.

Code: Alles auswählen

Traceback (most recent call last):
 File "D:\Daten\Python\Import\Import.py", line 75, in 
wi.write_to_db()
 File "D:\Daten\Python\Import\Import.py", line 70, in write_to_db
temp_i = %s""", (result, csv_data[j][1], float(csv_data[j][2])))
 File "C:\Programme\Python25\Lib\site-packages\MySQLdb\cursors.py", line 163, in execute
self.errorhandler(self, exc, value)
 File "C:\Programme\Python25\Lib\site-packages\MySQLdb\connections.py", line 35, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '),\n time = '00:00',\n temp_' at line 3")
Das ist komisch, denn wenn ich den SQL Code in der Form in PHPMyAdmin ausführe, wirds ohne Probleme ausgeführt.
Hier der SQL-Code:

Code: Alles auswählen

INSERT INTO open_web_data
SET
  web_id = 1,
  time = '00:00',
  temp_i = 15.03
Woran kann das liegen?
Muss man da evtl. in der schreibweise des Querys in Python auf was bestimmtes achten?

mfg
BlackJack

Schau Dir die Fehlermeldung mal genau an, da wird die Stelle in der SQL-Anweisung angegeben, an der das Problem auftritt. Das sieht so aus, als wenn es an einer schliessenden Klammer liegt, die in der Zeile vor 'time = ...' steht. Du hast in der Anweisung keine geschrieben, aber der Typ von `result` dürfte `tuple` sein und da werden die Klammern herkommen. Man kann keine Tupel als Wert einsetzen.
Antworten