en Python, je remplissons une base de données SQLite à l'aide de l'Importmany, afin que je puisse importer des dizaines de milliers de lignes de données à la fois. Mes données sont contenues comme une liste de tuples. J'ai eu ma base de données configurée avec les clés primaires où je les voulais.
Problème que j'ai couru était dans les erreurs principales de la clé jeux d'une intégritéError. Si je gère l'exception, mon script arrête l'importation au conflit principal principal.
de
Essayez: P>
try: self.curs.executemany("INSERT into towers values (NULL,?,?,?,?)",self.insertList) except IntegrityError: print "Primary key error" conn.commit()
3 Réponses :
Vous pouvez utiliser http://docs.python.org/library/sqlite3 .html # sqlite3.cursor.lastrowid p>
Si vous l'utilisez, vous ne pouvez pas utiliser lastrowid code> pour obtenir le point où vous avez arrêté: p>
exécuteur code>. p>
Utilisez A pour la boucle pour iTERE dans la liste et utilisez-le à la place de l'exécutant. Entourez la boucle pour votre essai et poursuivez l'exécution après une exception. Quelque chose comme ceci: Vous pouvez même compter combien d'éléments de la liste étaient vraiment insérés. P> p>
Si je comprends bien, exécuteur code> existe car il offre une augmentation significative de la vitesse sur les commandes code> exécutées par python-itératées. Donc, votre solution, alors qu'elle fonctionnerait, ralentira considérablement une importante importation de données. Une solution consisterait à garder une trace des touches principales qui ont été ajoutées dans un ensemble Python et filtrent la llematiste à l'avance avant de l'alimenter au curseur.
@Pethercmahan ok je suis d'accord. Ce n'est pas un code efficace. Il ne fait que "fonctionne" comme vous l'avez dit.
Pour répondre (2) Tout d'abord, si vous souhaitez continuer à charger après avoir obtenu une erreur, c'est une solution simple sur le côté SQL:
INSERT OR IGNORE INTO towers VALUES (NULL,?,?,?,?)