2017-06-02 2 views
0

Ich habe den folgenden Codedynamisch in eine SQLite-Datenbank Fehler

cur.executemany("INSERT INTO "+tablename+" (name,"+item+") VALUES(?,?)",(data,))

die dynamisch Werte von data fügt Jetzt habe ich zwei Probleme: Wenn ich die Syntax als VALUES(?,?)",(data)) ohne , after data verwenden würde ich Erhalten Sie diesen Fehler

Error Incorrect number of bindings supplied. The current statement uses 2, and there are 4 supplied.: 

, die nur mit der Syntax als gelöst wird VALUES(?,?)",(data,)) mit ,

Es löst dieses Problem und Daten werden in die Tabelle eingefügt. Aber es schafft ein weiteres Problem, das ich nicht die DB und nutzen so etwas wie

cursor = cur.execute("select * from "+tablename+" where name="+name+"")

ich diese Fehlermeldung erhalten würde abfragen kann:

Error no such column: deek: 

Ich weiß nicht, wie die zur Abfrage DB mit der oben genannten Syntax.

bekam ich die obige Syntax von sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 74 supplied

Komplett-Code als Referenz:

import sqlite3 
import sys 
tablename='asfoor' 
table_data=['Name','a','b','c'] 

try: 
    con = sqlite3.connect('dbtrials.db') 
    cur = con.cursor() 
    cur.execute("DROP TABLE IF EXISTS "+tablename+"") 
    cur.execute("CREATE TABLE "+tablename+" (ID INTEGER PRIMARY KEY AUTOINCREMENT ,Name TEXT, "+table_data[1]+" TEXT, "+table_data[2]+" TEXT, "+table_data[3]+" TEXT)") 



    name='deek' 
    item='a' 
    data=[name,item] 
    cur.executemany("INSERT INTO "+tablename+" (name,"+item+") VALUES(?,?)",(data,)) 
    cursor = cur.execute("select * from "+tablename+" where name="+name+"") 
    for row in cursor : 
       print(row) 


except sqlite3.Error as e: 

    print ("Error %s:" % e.args[0]) 
    sys.exit(1) 

finally: 

    if con: 
     con.close() 
+0

es ist das gleiche, wenn ich Werte verwenden (?,?)“, (Name, Position)) i noch Erhalten Sie den gleichen Fehler 'Die aktuelle Anweisung verwendet 2, und es gibt 4 geliefert ' –

Antwort

1

Der Grund für den Fehler ist, weil Sie die Zeichenfolge in Anführungszeichen setzen vergessen zu. Es sollte sein:

cursor = cur.execute("select * from "+tablename+" where name='"+name+"'") 

Aber es wäre besser, eine parametrisierte Abfrage zu verwenden:

cursor = cur.execute("select * from "+tablename+" where name= %s", (name,)) 
1

Die executemany erwartet Iterator von Sequenzen oder Zuordnungen als zweites Argument. Ihre Eingabe sollte wie folgt aussehen: data = [[name, item]]

So ist die Abfrage, die Sie erwarten:

  1. deek, a (2 args)

Ohne die innere Liste die Zeichenfolge als eine Folge nimmt der Zeichen so Ihre Fragen sind:

  1. d , e, e, k (4 args)

  2. a (1 arg)