2010-11-28 14 views
6

Necesito cargar una gran cantidad de datos a un MySQL db. Para la mayoría de los modelos, uso el ORM de django, pero uno de mis modelos tendrá miles de millones (!) De instancias y me gustaría optimizar su operación de inserción.Django: Usar inserciones de SQL sin procesar personalizadas con executemany y MySQL

Parece que no puedo encontrar la manera de ejecutar executemany(), y después de buscar en Google parece que casi no hay ejemplos.

Busco la sintaxis SQL correcta sintaxis del comando + + correcta estructura de datos valores correctos para apoyar un comando executemany para la siguiente instrucción SQL:

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

sí, estoy señalando claramente la Identificación (int_column1) por eficiencia.

Un ejemplo de código corto sería grande

Respuesta

16

He aquí una solución que realmente utiliza executemany()!

Básicamente, la idea en el ejemplo here funcionará.

Pero tenga en cuenta que en Django, debe utilizar el marcador de posición% s en lugar del signo de interrogación.

Además, querrá administrar sus transacciones. No entraré en eso aquí ya que hay mucha documentación 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

Medio año tarde, pero finalmente una respuesta con respecto a executemany(). No he probado su respuesta, pero la acepto y espero que su código funcione – Jonathan

+0

No puedo encontrar documentación para una función buildQueryList() en cualquier lugar. ¿Es parte de Django? – Trindaz

+0

si lees los comentarios ...le corresponde a USTED construir esa función en función de las necesidades específicas de su aplicación/esquema de la base de datos ... #aquí buildQueryList() representa alguna función para completar #la lista con registros múltiples # en el formato de tupla (valor1, valor2, valor3). – jsh

1

estás sugiriendo serisouly carga de mil millones de filas (instancias siento) de datos a través de alguna capa de acceso a datos ORM - ¿Cuánto tiempo tienes?

carga masiva si es posible - http://dev.mysql.com/doc/refman/5.1/en/load-data.html

+0

creo que se ha perdido donde escribí estoy usando ORM para la mayoría de los modelos (que tienen sólo unos pocos cientos de casos) y el uso de SQL prima para el modelo único que tiene mil millones de casos, pero el enlace es útil gracias – Jonathan

+0

Además, realmente no puedo usar load-data, ya que manipulo los datos antes de ingresarlos al db ... – Jonathan

+0

Por último, sí, es tan importante, incluso si lleva unos días insertarlo en el db. Es una operación de una sola vez (hasta la próxima vez ...) – Jonathan

1

Si necesita modificar los datos, carga a granel con load data en una tabla temporal como es. Luego aplique modificaciones con un comando insert into select. IME, esta es de lejos la forma más rápida de obtener una gran cantidad de datos en una tabla.

Cuestiones relacionadas