Django: использование пользовательских необработанных вставок SQL с executemany и MySQL - PullRequest
6 голосов
/ 28 ноября 2010

Мне нужно загрузить много данных в базу данных MySQL. Для большинства моделей я использую ORM django, но одна из моих моделей будет иметь миллиарды (!) Экземпляров, и я хотел бы оптимизировать операцию вставки.

Кажется, я не могу найти способ заставить executemany () работать, и после поиска в Google кажется, что примеров там почти нет.

Я ищу правильный синтаксис SQL + правильный синтаксис команды + правильная структура данных значений для поддержки команды executemany для следующего оператора SQL:

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

Да, я явно указываю id (int_column1) для эффективности.

Был бы хорош короткий пример кода

Ответы [ 4 ]

18 голосов
/ 23 мая 2011

Вот решение, которое на самом деле использует executemany ()!

В основном идея в примере здесь будет работать.

Но обратите внимание, что в Django вам нужноиспользуйте заполнитель% s вместо знака вопроса.

Кроме того, вы захотите управлять своими транзакциями.Я не буду вдаваться в подробности, так как есть много документации.

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()
1 голос
/ 29 ноября 2010

Если вам нужно изменить данные, выполните массовую загрузку с load data во временную таблицу как есть.Затем примените изменения с помощью команды insert into select.IME, это самый быстрый способ получить много данных в таблицу.

1 голос
/ 28 ноября 2010

Вы серьезно предлагаете загрузить миллиарды строк (извините, экземпляры) данных через какой-то уровень доступа к данным ORM - сколько у вас времени?

массовая загрузка, если это возможно - http://dev.mysql.com/doc/refman/5.1/en/load-data.html

0 голосов
/ 04 декабря 2010

Я не уверен, как использовать команду executemany (), но вы можете использовать один оператор SQL INSERT для вставки нескольких записей

...