Как вставить 1 миллион строк в базу данных Oracle с помощью Python? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть ~ 100 000-1 000 000 строк для вставки в базу данных Oracle18c. Я совершенно новичок в Oracle и такой степени важности данных. Я считаю, что должен быть какой-то оптимальный способ сделать это, но сейчас мне удалось реализовать только построчную вставку:

def insertLines(connection, tableName, column_names, rows):
    cursor = connection.cursor()
    if tableExists(connection, tableName):
        for row in rows:
            sql = 'INSERT INTO {} ({}) VALUES ({})'.format(tableName, column_names, row)
            cursor.execute(sql)
    cursor.close()

Есть ли какой-нибудь четкий способ в Oracle для группирования строк для достижения более высокой эффективности с помощью cx_Oracle (библиотеки Oracle python)?

РЕДАКТИРОВАТЬ: я читаю данные из файла CSV.

Ответы [ 3 ]

2 голосов
/ 21 марта 2019

Я не знаю, в каком формате у вас есть данные, но SQL Data Loader - это утилита командной строки, специально созданная для добавления больших объемов данных в Oracle.

1 голос
/ 22 марта 2019

Самый оптимальный и простой способ с точки зрения производительности - создать внешнюю таблицу поверх файла CSV, а затем использовать SQL для вставки.

1 голос
/ 21 марта 2019

Если ваши данные уже есть в Python, используйте executemany(). В вашем случае с таким количеством строк вы, вероятно, все равно выполняете несколько вызовов для вставки пакетов записей. Смотри https://blogs.oracle.com/opal/efficient-and-scalable-batch-statement-execution-in-python-cx_oracle

data = [
    (60, "Parent 60"),
    (70, "Parent 70"),
    (80, "Parent 80"),
    (90, "Parent 90"),
    (100, "Parent 100")
]

cursor.executemany("""
        insert into ParentTable (ParentId, Description)
        values (:1, :2)""", data)

Как отмечают другие

  • Избегайте использования интерполяции строк в выражениях, поскольку это представляет угрозу безопасности. Это также проблема масштабируемости. Используйте переменные связывания. Там, где вам нужно использовать строковую интерполяцию для таких вещей, как имена столбцов, убедитесь, что вы санировали все значения.
  • Если данные уже находятся на диске, то лучше использовать SQL * Loader или Data Pump, чем читать их в cx_Oracle и затем отправлять в БД.
...