Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Django: использование пользовательских необработанных вставок SQL с executemany и MySQL

Автор вопроса: JonathanОтветов: 4

Мне нужно загрузить много данных в базу данных 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) для эффективности.

Короткий пример кода был бы отличным

djangosqlinsert

Ответы

Ответ 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, это, безусловно, самый быстрый способ получить много данных в таблице.

Ответ 4 · Jonathan

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы