Я прочитал сообщения: Вставьте TIMESTAMP с миллисекундами в Oracle с cx_ Oracle и Python 3.6 и sqlserver datetime до oracle проблемы с отметкой времени , но Ни один из них не решил мою проблему.
Потому что номер столбца моей Oracle таблицы больше, чем одна.
Я протестировал обе вышеуказанные ссылки (спасибо им). Тем не менее, их эффективность ограничена. Например, если порядок столбцов столбца отметок времени в таблице Oracle не равен 1, тогда установка cursor.setinputsizes (cx_ Oracle .TIMESTAMP) не работает.
Согласно Panagiotis Kanavos ( sqlserver datetime к oracle проблемы с отметкой времени ):
ts = datetime.datetime.now()
cursor.prepare("INSERT INTO python_tstamps VALUES(:t_val)")
cursor.setinputsizes(t_val=cx_Oracle.TIMESTAMP)
cursor.execute(None, {'t_val':ts})
db.commit()
С другой стороны, у меня есть несколько записей для вставки, например ~ 250k. Итак, мне нужно извлечь все мои данные и преобразовать их в словарь, и, наконец, добавить этот объект словаря в список, чтобы использовать входной объект в функции executemany.
column_name = ["instance_id", "record_id", "record_id1"]
dict1 = dict(zip(column_name,outputsql[0]))
for key in dict1:
print(key)
t = []
t.append(dict1)
cursororacle.prepare("INSERT /*+ append */INTO schematest.test VALUES (:instance_id, :record_id, :record_id1)")
cursororacle.setinputsizes(instance_id=cx_Oracle.TIMESTAMP, record_id=cx_Oracle.TIMESTAMP)
cursororacle.executemany(None, t)
Конвекция 250 тыс. Записей неэффективна , Есть ли другое решение / с?
Редактировать: Я хочу вставить свои выходные данные (вывод sql) без преобразования словаря. Является ли это возможным; если это так, то как?
Заранее спасибо!
Ps: output sql является выводом другого запроса сеанса БД и возвращает записи с правильной точностью в миллисекундах.
cursorsql = connsql.cursor()
cursorsql.execute('select top 1 record_id, instance_id, record_id from dbo.recordlog (nolock)')
outputsql = cursorsql.fetchall()