2016-04-22 6 views
0

Ich versuche, Zeilen in eine MySQL-Tabelle mit pymysql (Python 3) einzufügen, der entsprechende Code ist der folgende.pymysql: Wie formatieren Sie Typen auf Abfrage?

def saveLogs(DbConnection, tableName, results): 
    for row in results: 
     formatStrings = ",".join(["?"]*len(row)) 
     sql = "INSERT INTO %s VALUES (%s);"%(tableName,formatStrings) 
     DbConnection.cursor().execute(sql, tuple(row)) 
    DbConnection.commit() 

Ich verwende "?" für die Typen, aber ich habe den Fehler not all arguments converted during string formatting. row ist eine Liste bestehend aus string s, int s und datetime.datetime. Ich denke, das Problem ist die "?", aber ich habe die PEP 249 überprüft und es ist mir immer noch nicht klar, wie ich es tun soll. Irgendwelche Vorschläge?

Antwort

1

Verwenden Sie die Zeichenfolgenformatierung nur für den Tabellennamen (stellen Sie jedoch sicher, dass Sie der Quelle vertrauen oder eine ordnungsgemäße Überprüfung durchführen). Für alles andere verwenden Abfrageparameter:

def saveLogs(DbConnection, tableName, results): 
    cursor = DbConnection.cursor() 
    sql = "INSERT INTO {0} VALUES (%s, %s, %s)".format(tableName) 
    for row in results: 
     cursor.execute(sql, row) 
    DbConnection.commit() 

Es gibt auch, dass executemany() method:

def saveLogs(DbConnection, tableName, results): 
    cursor = DbConnection.cursor() 
    cursor.executemany("INSERT INTO {0} VALUES (%s, %s, %s)".format(tableName), results) 
    DbConnection.commit() 
+0

"% s" nicht String ist? Wie behandelt man Daten und ganze Zahlen? – lithiium

+0

@lithiium Der mysql-Treiber sollte die Typkonvertierungen selbst behandeln, wenn Sie parametrisierte Abfragen durchführen. – alecxe