Как вставить json данные в таблицу ORACLE? - PullRequest
1 голос
/ 26 мая 2020

Подскажите, как вставить данные из файла json в таблицу? У меня есть таблица TESDB, и есть 2 столбца LAST_NAME, FIRST_NAME. Я хотел вставить все данные JSON в таблицу. Подскажите пожалуйста, как это правильно сделать? Заранее благодарим

Json файл:

[{'LAST_NAME': 'Alex', 'FIRST_NAME': 'Pip'}, {'LAST_NAME': 'John', 'FIRST_NAME': 'Alan'}, {'LAST_NAME': 'Dehan', 'FIRST_NAME': 'Luck'}, {'LAST_NAME': 'Nick', 'FIRST_NAME': 'Adem'}, {'LAST_NAME': 'Aspen', 'FIRST_NAME': 'Turit'}]

Python код:

with open('object.json') as f:
    json_obj = json.load(f)
print(json_obj)

for i,item in enumerate(json_obj):
    LAST_NAME = (item.get("LAST_NAME", None))
    FIRST_NAME =(item.get("FIRST_NAME", None))
cursor.execute("insert into TESTDB (LAST_NAME,FIRST_NAME) VALUES (:1,:2)", (LAST_NAME,FIRST_NAME))
conn.close

1 Ответ

0 голосов
/ 27 мая 2020

В вашем коде есть некоторые проблемы, например:

  • Одинарные кавычки в файле JSON следует заменить двойными кавычками
  • con.commit() отсутствует после оператора DML
  • cursor.execute должно иметь отступ, чтобы запускаться в контексте for loop, чтобы все существующие значения были вставлены в таблицу.

    В вашем случае в таблицу будет вставлена ​​только последняя запись с LAST_NAME = 'Aspen' и FIRST_NAME = 'Turit'.

    import json
    import cx_Oracle
    
    con = cx_Oracle.connect('<un>/<pwd>@<hostname>:<port>/<dbname>')
    cursor = con.cursor()
    
    with open('object.json') as f:
        json_obj = json.load(f)
    
    for i,item in enumerate(json_obj):
        LAST_NAME = (item.get("LAST_NAME"))
        FIRST_NAME =(item.get("FIRST_NAME"))
        cursor.execute("INSERT INTO TESTDB
                       (LAST_NAME,FIRST_NAME) VALUES (:1,:2)", (LAST_NAME,FIRST_NAME))
    con.commit()
    con.close  
    

где

  • Вышеупомянутый случай может использоваться для файла JSON, расположенного в том же каталоге, что и файл python.

    В противном случае это должно быть открыто путем указания пути, например

    with open(r'C:\myfiles\json\object.json') as f:

  • , определение второго аргумента как None для функции item.get() является избыточным.

Обновление: Из-за проблем с производительностью часть

cursor.execute("INSERT INTO TESTDB
               (LAST_NAME,FIRST_NAME) VALUES (:1,:2)", (LAST_NAME,FIRST_NAME))

следует заменить на

cursor.prepare("INSERT INTO TESTDB(LAST_NAME,FIRST_NAME) VALUES (:1,:2)")
cursor.executemany(None,([(LAST_NAME,FIRST_NAME)])) 

с использованием executemany() как указал @Christopher Jones. Спасибо ему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...