SQL plusieurs insertions avec Python
Mise à JOUR
Après le passage execute() une liste de lignes que par Nathan de la suggestion, ci-dessous, le code s'exécute plus loin, mais obtient toujours bloqué sur la fonction execute. Le message d'erreur:
query = query % db.literal(args)
TypeError: not all arguments converted during string formatting
De sorte qu'il ne fonctionne toujours pas. Quelqu'un sait pourquoi il y a une erreur de type maintenant?
MISE À JOUR DE FIN
J'ai une grande liste de liste de diffusion .xls. Je suis à l'aide de python avec xlrd pour récupérer le nom et le courriel de fichier xls dans les deux listes. Maintenant, je veux mettre chaque nom et e-mail dans une base de données mysql. Je suis l'aide de MySQLdb pour cette partie. Évidemment, je ne veux pas faire une instruction insert pour chaque élément de la liste.
Voici ce que j'ai jusqu'à présent.
from xlrd import open_workbook, cellname
import MySQLdb
dbname = 'h4h'
host = 'localhost'
pwd = 'P@ssw0rd'
user = 'root'
book = open_workbook('h4hlist.xls')
sheet = book.sheet_by_index(0)
mailing_list = {}
name_list = []
email_list = []
for row in range(sheet.nrows):
"""name is in the 0th col. email is the 4th col."""
name = sheet.cell(row, 0).value
email = sheet.cell(row, 4).value
if name and email:
mailing_list[name] = email
for n, e in sorted(mailing_list.iteritems()):
name_list.append(n)
email_list.append(e)
db = MySQLdb.connect(host=host, user=user, db=dbname, passwd=pwd)
cursor = db.cursor()
cursor.execute("""INSERT INTO mailing_list (name,email) VALUES (%s,%s)""",
(name_list, email_list))
Le problème lorsque le curseur s'exécute. C'est l'erreur: _mysql_exceptions.OperationalError: (1241, 'Operand should contain 1 column(s)')
j'ai essayé de mettre ma requête dans une var au départ, mais ensuite il a juste barfed un message sur le passage d'un tuple à execute().
Ce que je fais mal? Est-ce même possible?
La liste est énorme et j'ai vraiment ne peut pas se permettre de mettre de l'insérer dans une boucle. J'ai regardé avec LOAD DATA INFILE, mais je ne comprends vraiment pas comment format du fichier ou de la requête et mes yeux saignent quand je dois lire MySQL docs. Je sais que je pourrait probablement utiliser certains en ligne xls pour mysql converter, mais c'est un exercice d'apprentissage pour moi. Est-il une meilleure façon de?
%
opérateur de construction de requêtes! Suivez Nathan code de plus près.query = query % db.literal(args)
était le message d'erreur pas de mon code. De toute façon Jon fixe mon problème.OriginalL'auteur noel | 2012-10-22
Vous devez vous connecter pour publier un commentaire.
De fixer
TypeError: not all arguments converted during string formatting
- vous besoin d'utiliser lecursor.executemany(...)
méthode, que ce accepte un objet iterable des n-uplets (plus d'une ligne), tandis quecursor.execute(...)
attend le paramètre à une seule rangée de valeur.Après l'exécution de la commande, vous devez vous assurer que la transaction s'est engagé à apporter les modifications actives dans la base de données en utilisant
db.commit()
.OriginalL'auteur Jon Clements
Vous avez besoin de donner
executemany()
une liste de lignes. Vous n'avez pas besoin de casser le nom et l'adresse électronique dans des listes distinctes, il suffit de créer une liste avec les deux valeurs.Mise à jour: @JonClements mentionne, il devrait être
executemany()
pasexecute()
.essayez d'utiliser
cursor.executemany(...)
au lieuavec exécuter de nombreuses le script comletes sans erreurs, mais ma db est encore vide.
Ensuite, assurez-vous que votre transaction est validée -
db.commit()
vous êtes génial. Si vous rédigez une réponse, je vais sauf elle.
OriginalL'auteur Nathan Villaescusa
Si vous êtes intéressé à haute performance du code, cette réponse peut-être mieux.
Comparer à
excutemany
, la méthode ci-dessousexecute
sera beaucoup plus rapide:Vous pouvez facilement modifier la réponse de @Nathan Villaescusa et obtenir le nouveau code.
voici mon propre résultat du test:
La différence de vitesse sera d'environ 15 fois.
OriginalL'auteur Pengju Zhao