Python cx_ Oracle Вставить метку времени с миллисекундами - PullRequest
0 голосов
/ 21 апреля 2020

Я прочитал сообщения: Вставьте 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()

1 Ответ

1 голос
/ 22 апреля 2020

Нет необходимости конвертировать ваши данные в словари. Документация для cursor.setinputsizes() показывает, что вы можете передавать либо позиционные аргументы, либо аргументы ключевых слов. Таким образом, если вам нужно указать, что третий столбец должен быть временной меткой, вы можете сделать следующее:

cursor.setinputsizes(None, None, cx_Oracle.TIMESTAMP)

Это говорит о том, что первые две позиции привязки могут использовать привязку по умолчанию. Это будет определено путем изучения данных, которые предоставляются при вызове cursor.execute() или cursor.executemany(). Третья позиция привязки будет связана как столбец отметки времени.

Надеюсь, это достаточно ясно!

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