Мне нужно загрузить много данных в базу данных 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)
Да, я явно указываю идентификатор (int_column1) для эффективности.
Короткий пример кода был бы отличным
Ответ 1 · рейтинг 19 · jsh
Вот решение, которое на самом деле использует executemany() !
В основном идея из примера здесь будет работать.
Но обратите внимание, что в Django вам нужно использовать заполнитель %s, а не вопросительный знак.
Кроме того, вы захотите управлять своими транзакциями. Я не буду вдаваться в это здесь, так как есть много доступной документации.
from django.db import connection,transaction
cursor = connection.cursor()
query = ''' INSERT INTO table_name
(var1,var2,var3)
VALUES (%s,%s,%s) '''
query_list = build_query_list()
# here build_query_list() represents some function to populate
# the list with multiple records
# in the tuple format (value1, value2, value3).
cursor.executemany(query, query_list)
transaction.commit()
Ответ 2 · рейтинг 1 · Jon Black
Вы серьезно предлагаете загружать миллиарды строк (извините, экземпляров) данных через какой-то уровень доступа к данным ORM - как долго у вас есть?
массовая загрузка, если это возможно - http://dev.mysql.com/doc/refman/5.1/en/load-data.html
Ответ 3 · рейтинг 1 · nate c
Если вам нужно изменить данные, выполните массовую загрузку с помощью load data во временную таблицу как есть. Затем примените изменения с помощью команды insert into select. IME, это, безусловно, самый быстрый способ получить много данных в таблице.