Вставить в таблицу оракула из CSV с помощью python

Я читаю файл csv с 5 столбцами и нажимаю на таблицу оракула.

Структура CSV-файла

Я знаю, что есть много ресурсов по этому вопросу. Но даже тогда я не могу найти решение своей проблемы.

Код для чтения CSV на python:

 import csv
 reader = csv.reader(open("sample.csv","r"))
 lines=[]
 for line in reader:
      lines.append(line)
  print lines 

Выход :

[['Имя', 'Фамилия', 'электронная почта', 'Имя_курса', 'статус'], ['Кристина', 'Бон', '[email protected]', 'Руководство по капнографии в управлении критической Больной пациент (CE)», «Зарегистрирован»], [«Пегги», «Lutz», «[email protected]», «Руководство по мониторингу EtCO2 во время введения опиоидов (CE)», «В процессе»]]

Код для отправки списка в таблицу Oracle:

import cx_Oracle
con = cx_Oracle.connect('username/password@tamans*****vd/Servicename')
ver=con.version.split(".")
print(ver)
cur=con.cursor()
cur.execute("INSERT INTO TEST_CSODUPLOAD ('FIRSTNAME','LASTNAME','EMAIL','COURSE_NAME','STATUS') VALUES(:1,:2,:3,:4,:5)",lines)
con.commit ()
cur.close()

Я получаю сообщение об ошибке:

DatabaseError: ORA-01484: массивы могут быть привязаны только к операторам PL/SQL

Помогите пожалуйста решить проблему Заранее спасибо


person gowtham Y.R    schedule 30.08.2016    source источник


Ответы (3)


Проблема в том, что вы пытаетесь передать массив в один оператор вставки. Здесь у вас есть два варианта:

1) Используйте цикл, чтобы вставить каждую строку отдельно:

for line in lines:
    cursor.execute("insert into ...", line)

2) Вместо этого используйте cursor.executemany() для вставки массива.

cursor.executemany("insert into ...", lines)

Второй вариант более эффективен, но вы должны убедиться, что тип данных соответствует для каждой строки. Если у вас есть число в одной строке и строка в следующей строке, возникнет ошибка.

документация дает более подробную информацию.

person Anthony Tuininga    schedule 31.08.2016

Спасибо за ваши ответы :) Проблема была решена после того, как я перешел с

cur.execute("INSERT INTO TEST_CSODUPLOAD ('FIRSTNAME','LASTNAME','EMAIL','COURSE_NAME','STATUS') VALUES(:1,:2,:3,:4,:5)",lines)

to

cur.executemany("insert into TEST_CSODUPLOAD(Firstname,LastName,email,Course_name,status) values (:1, :2, :3, :4,:5)", lines)
person gowtham Y.R    schedule 31.08.2016
comment
Рад это слышать. Почему вы создали новый ответ вместо того, чтобы просто принять тот, который я дал? - person Anthony Tuininga; 31.08.2016

Эта ошибка означает то, что она сказала здесь

Это не ошибка. Вы отправляете SQL-запрос, а не оператор PL/SQL, и такие вещи не поддерживаются Oracle. В этом конкретном случае вы можете просто передать строку. Если у вас есть несколько строк, вам нужно будет использовать подзапрос. Взгляните на операторы table() и cast() для вдохновения!

Вы также можете сбросить в файл sql и выполнить его.

person lauralacarra    schedule 31.08.2016
comment
Хорошая точка зрения. Хотя в этом случае ОП не выдает запрос! :-) - person Anthony Tuininga; 31.08.2016
comment
Вау, решение cursor.executemany потрясающее! я бы изменил свой код!! @AnthonyTuininga, насколько большим может быть массив? Потому что я работаю со слишком большим количеством вставок. Уважают ли они nextval currval? Спасибо - person lauralacarra; 02.09.2016
comment
Массив может быть сколь угодно большим — конечно, в пределах ограничений памяти и самой базы данных! Я не совсем понимаю, что вы имеете в виду под nextval и currval. Вы можете использовать их в своем операторе вставки, и они будут вести себя так же, как и везде. - person Anthony Tuininga; 03.09.2016