2017-08-10 5 views
0

J'ai un problème pour insérer une liste dans une base de données mysql avec le pilote MySQLdb.Insérer une liste dans la base de données MySQLdb Python3.6

import MySQLdb 

db = MySQLdb.connect("localhost", "user", "password", "db") 

c = db.cursor() 
cities = ["New York", "NY", 8400000] 

sql = "INSERT INTO projecten.population(city, state, population) VALUES(?, ?, ?)", cities 

try: 
    c.execute(sql) 
    db.commit() 
except MySQLdb.OperationalError: 
    print("error") 
finally: 
    db.close() 

C'est l'erreur

TypeError: a bytes-like object is required, not 'tuple' 

Répondre

0

J'ai obtenu la réponse

c.executemany("INSERT INTO projecten.population(city, state, population) VALUES(%s, %s, %s)", (cities)) 
0

Peut-être que vous voulez utiliser formatter chaîne avec tuple -

>>> sql = "INSERT INTO projecten.population(city, state, population) VALUES('%s', '%s', '%s')" % tuple(cities) 
>>> sql 
"INSERT INTO projecten.population(city, state, population) VALUES('New York', 'NY', '8400000')" 
+0

Mais en utilisant% n'est pas en sécurité avec les injections SQL –

+0

point valide. Pouvez-vous essayer cur.execute ("INSERT INTO projecten.population (ville, état, population) VALEURS (% s,% s,% s)", (villes,)) Refer - http: //mysql-python.sourceforge. net/MySQLdb.html # some-examples – Rishi

+0

Vous ne pouvez utiliser (villes,) que lorsque la variable contient une valeur. Si la variable contient plus d'une valeur, vous utilisez (villes). –

0

L'instruction SQL doit être transmis correctement avec des valeurs.

import MySQLdb 
db = MySQLdb.connect("localhost", "user", "password", "db") 
c = db.cursor() 
cities = ["New York", "NY", 8400000] 
sql = "INSERT INTO projecten.population(city, state, population) VALUES({0}, {1}, {2})".format(*cities) 
try: 
    c.execute(sql) 
    db.commit() 
except MySQLdb.OperationalError: 
    print("error") 
finally: 
    db.close()