2010-11-28 15 views
6

J'ai besoin de télécharger beaucoup de données sur une base de données MySQL. Pour la plupart des modèles, j'utilise l'ORM de django, mais un de mes modèles aura des milliards (!) D'instances et j'aimerais optimiser son opération d'insertion.Django: Utiliser des insertions SQL raw personnalisées avec executemany et MySQL

Je n'arrive pas à trouver un moyen de faire fonctionner executemany(), et après googling, il semble qu'il n'y ait presque aucun exemple.

Je cherche la syntaxe SQL correcte + syntaxe de commande correcte + structure de données de valeurs correctes pour soutenir une commande executemany pour l'instruction SQL suivante:

INSERT INTO `some_table` (`int_column1`, `float_column2`, `string_column3`, `datetime_column4`) VALUES (%d, %f, %s, %s) 

Oui, je suis en indiquant explicitement l'id (int_column1) pour l'efficacité.

Un code court exemple serait génial

Répondre

16

Voici une solution qui utilise en fait executemany()!

Fondamentalement, l'idée de l'exemple here fonctionnera. Mais notez que dans Django, vous devez utiliser l'espace réservé% s plutôt que le point d'interrogation.

Aussi, vous voudrez gérer vos transactions. Je ne vais pas entrer dans ici parce qu'il y a beaucoup de documentation disponible.

from django.db import connection,transaction 
cursor = connection.cursor() 



query=''' INSERT INTO table_name 
     (var1,var2,var3) 
     VALUES (%s,%s,%s) ''' 


queryList=buildQueryList() 

#here buildQueryList() represents some function to populate 
#the list with multiple records 
#in the tuple format (value1,value2,value3). 


cursor.executemany(query,queryList) 

transaction.commit() 
+0

Un demi-année en retard, mais enfin une réponse concernant executemany(). Je n'ai pas testé votre réponse, mais je l'accepte et j'espère que votre code fonctionne – Jonathan

+0

Je ne trouve pas de documentation pour une fonction buildQueryList() n'importe où. Est-ce que ça fait partie de Django? – Trindaz

+0

si vous lisez les commentaires ...C'est à VOUS de construire cette fonction en fonction des besoins spécifiques de votre application/schéma de base de données ... #ici buildQueryList() représente une fonction à remplir #la liste avec plusieurs enregistrements #dans le format de ligne (valeur1, valeur2, value3). – jsh

1

suggérez-vous serisouly charger des milliards de lignes (instances) désolé de données via une couche d'accès aux données ORM - combien de temps avez-vous?

charge en vrac si possible - http://dev.mysql.com/doc/refman/5.1/en/load-data.html

+0

Je pense que vous avez manqué où j'ai écrit que je utilise ORM pour la plupart des modèles (qui ont seulement quelques centaines de cas) et l'utilisation de SQL pour le modèle brut unique qui a des milliards de cas, mais le lien est utile merci – Jonathan

+0

En outre, je ne peux pas vraiment utiliser les données de charge, car je manipule les données avant de les entrer dans la base de données ... – Jonathan

+0

Enfin, oui, c'est important, même s'il faut quelques jours pour insérer dans le fichier. db. C'est une opération unique (jusqu'à la prochaine fois ...) – Jonathan

1

Si vous avez besoin de modifier les données, chargement en vrac avec load data dans une table temporaire est. Appliquez ensuite les modifications avec une commande insert into select. IME, c'est de loin le moyen le plus rapide d'obtenir beaucoup de données dans une table.