Я пытаюсь экспортировать базу данных Oracle с помощью Python cx_Oracle.Я подключаюсь к БД, запрашиваю все нужные мне строки и затем строю из них оператор INSERT.Я использую код, подобный следующему:
table_name = "AUDIT"
where_clause = "id > 10"
query = "SELECT * FROM " + table_name + " WHERE " + where_clause
curs = db_conn.cursor()
curs.execute(query)
res = curs.fetchall()
columns = []
for i in range(0, len(curs.description)):
columns.append(curs.description[i][0])
column_names = ",".join(columns)
statement = "INSERT INTO %s (%s) VALUES %s" % (table_name, column_names, row)
print statement
Типы: NUMBER, VARCHAR2, DATE, NUMBER, и я получаю оператор вставки, который выглядит хорошо ... за исключением поля даты:
INSERT INTO AUDIT_LOG (LOG_DBID,USER_NAME,EVENT_DATE,SEVERITY) VALUES ('AUDIT_LOG_SQ.nextval', 'user@do',datetime.datetime(2018, 4, 28, 1, 57, 42), '1')
Когда я пытаюсь выполнить это, через sqlplus или с помощью того же курсора, я получаю следующую ошибку:
Error starting at line 1 in command:
INSERT INTO AUDIT_LOG (LOG_DBID,USER_NAME,EVENT_DATE,SEVERITY) VALUES ('AUDIT_LOG_SQ.nextval', 'SYSTEM@do',datetime.datetime(2018, 4, 28, 1, 57, 42), '1')
Error at Command Line:1 Column:95
Error report:
SQL Error: ORA-00904: "DATETIME"."DATETIME": invalid identifier
00904. 00000 - "%s: invalid identifier"
Без элемента datetime запросы работают нормально. Как вставить результат, полученный из курсора?
Я проверил экспорт SQL_Developer для сравнения с моим, и у них есть другой способ его обработки:
INSERT INTO AUDIT_LOG (LOG_DBID,USER_NAME,EVENT_DATE,SEVERITY) VALUES ('AUDIT_LOG_SQ.nextval', 'user@do',to_timestamp('25-APR-18','DD-MON-RR HH.MI.SSXFF AM'), '1')
Который я действительно не нашел способа дублировать (не превращая весь запрос в некрасивую конкатенацию строк), и я не уверен, что мне нужно - должно быть что-то, что я упускаю!
Любая помощь будет оценена, спасибо!