2012-04-06 12 views
2

Ich versuche, eine Abfrage mit dem Tornado's database wrapper, wie dies auszuführen -Typeerror: nicht genügend Argumente für Formatstring

p_id = db.execute_lastrowid("""INSERT INTO `gplaces`.`place` 
            (`gid`, `name`, `reference`, `lat`, `long`, `vicinity`) 
            VALUES (%s, %s, %s, %s, %s, %s)""", 
            (
             str(place['id']), 
             str(place['name']), 
             str(place['reference']), 
             float(place['geometry']['location']['lat']), 
             float(place['geometry']['location']['lng']), 
             str(place['vicinity']) 
            ) 
           ) 

Aber immer bekommen die Fehler im Titel. Hier ist die Traceback -

Traceback (most recent call last): 
    File "insertbs.py", line 38, in <module> 
    str(place['vicinity']) 
    File "/home/bibhas/Works/yodl/database.py", line 145, in execute_lastrowid 
    self._execute(cursor, query, parameters) 
    File "/home/bibhas/Works/yodl/database.py", line 207, in _execute 
    return cursor.execute(query, parameters) 
    File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 159, in execute 
    query = query % db.literal(args) 
TypeError: not enough arguments for format string 

Nicht sicher, was ich falsch mache.

Antwort

6

Übergeben Sie kein Tupel von Werten, übergeben Sie sie als separate Argumente.

Von der Zurückverfolgungs:

query = query % db.literal(args) 

Hinweis, was in interpoliert ist wird - args. Im Grunde, entfernen Sie einfach die () um die Dinge, die Sie übergeben, so dass sie stattdessen als Argumente übergeben werden.

+0

Sie meinen wie ein Wörterbuch? Tut mir leid, wenn ich wie ein Noob klingen. –

+0

Nein, ich meine wie anstelle von 'db.execute_lastrowid (" Abfrage ", (a, b, c))', tun 'db.execute_lastrowid (" Abfrage ", a, b, c)'. – Amber

+0

Bekam es. Das hat funktioniert. Vielen Dank. :) Ich war verwirrt, da ich "Parameter" sah, da ich dachte, dass es eine einzige Variable mit allen Daten als Tupel sein wird. –

3

Geben Bernstein den Kredit, ich bin Entsendung nur ein Beispiel:

p_id = db.execute_lastrowid("""INSERT INTO `gplaces`.`place` 
           (`gid`, `name`, `reference`, `lat`, `long`, `vicinity`) 
           VALUES (%s, %s, %s, %s, %s, %s)""", 

           str(place['id']), 
           str(place['name']), 
           str(place['reference']), 
           float(place['geometry']['location']['lat']), 
           float(place['geometry']['location']['lng']), 
           str(place['vicinity']) 

          ) 

Also, bevor Sie nur ein Argument waren vorbei, ein Tupel alle Ihre Argumente enthält. In diesem Beispiel übergeben Sie 6 Argumente, was erwartet wird.

+0

Vielen Dank. Ich habe es von seinem Update und Kommentar bekommen. :) –

Verwandte Themen