Массовая вставка из списка Python / dict в базу данных Oracle с помощью cx_Oracle executemany () - PullRequest
0 голосов
/ 01 июня 2019

Я вставляю данные из словаря Python в базу данных Oracle.Я использовал executemany () из класса курсора.Я получаю следующую ошибку:

ORA-01036: недопустимое имя / номер переменной

Также, когда я использую try / кроме executemany (), я получаю дополнительную ошибку:

cx_Oracle.DatabaseError: DPI-1010: не подключен

Среда: Python: 3.6.7, Oracle: 12c, cx_Oracle: 7.1.2, ОС: Ubuntu

Я преобразовал данные словаря в список словаря и передал их как второй параметр executemany (), но получил те же ошибки.Вот как выглядит мой список словарей

    [{'location': 1, 'xxx_id': 917985, 'seq': 758, 'event_time': 
    datetime.datetime(2019, 5, 5, 20, 1, 53), 'event_type': 'xxxx', 'number': 
    123, 'stop': '40305', 'x': None, 'y': None, 'arrival_time': 
    datetime.datetime(2019, 5, 5, 20, 1, 33), 'departure_time': 
    datetime.datetime(2019, 5, 5, 20, 2), 'yyy_id': 529934, 'zzz_id': 59359277}, 
   {'location': 1, 'xxx_id': 917985, 'seq': 759, 'event_time': 
   datetime.datetime(2019, 5, 5, 20, 2, 33), 'event_type': 'xxxx', 'number': 
   123, 'stop': '40301', 'x': None, 'y': None, 'arrival_time': 
   datetime.datetime(2019, 5, 5, 20, 2, 27), 'departure_time': 
   datetime.datetime(2019, 5, 5, 20, 2, 50), 'yyy_id': 529930, 'zzz_id': 59279},

   {.......},
   {.......}
   ]

Пробовал другие рекомендации от stackoverflow, но не повезло.ближе всего к моей ситуации это. Вставить список словарей в таблицу SQL, используя python

Вот мой код, который я пробовал

    sql_insert = '''INSERT INTO TABLE_NAME (LOCATION, XXX_ID, SEQ, 
    EVENT_TIME, EVENT_TYPE, NUMBER, STOP, X, Y, ARRIVAL_TIME, DEPARTURE_TIME, 
    YYY_ID, ZZZ_ID)
    VALUES(:1, :2, :3, :4, :5, :6, :7, :8, :9, :10, :11, :12, :13)'''

    for k1, v1 in events.items():
        list_events = []
        for k2, v2 in v1.items():
            x = dict(v2)
            # print(x)
            list_events.append(x)
            cursor = connection.cursor()
        try:
            cursor.executemany(sql_insert, list_events)
            connection.commit()
        except cx_Oracle.DatabaseError as e:
            print(e)

Я пытаюсь вставить несколько тысяч записей.Любая помощь будет очень ценной.

Ответы [ 2 ]

1 голос
/ 05 июня 2019

Мой коллега предложил использовать именованный (например, values ​​(: location,: peggo_id, ....) заполнитель вместо нумерованного заполнителя, и он работал с именованным заполнителем. Хотя я не уверен, является ли это Oracle или cx_Oracle вещь. Кроме того, именованные параметры должны точно совпадать с именем ключа в словаре, если вы передаете словарь в метод executemany ().

0 голосов
/ 01 июня 2019

См. Эффективное и масштабируемое выполнение пакетных операторов в 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)
...