Как преобразовать дату и время Python в метку времени и вставить в базу данных Oracle с помощью to_sql

Я получил DatabaseError: ORA-00904: "DAT_ULT_ALT": invalid identifier когда я пытаюсь вставить дату и время в oracle, используя to_sql из панд с движком SQL Alchemy. Мой код:

import sqlalchemy as sa

import datetime

import itertools

...

oracle_db = sa.create_engine('oracle://username:password@host:port/database')

connection= oracle_db.connect()

...

dat_ult_alt = datetime.datetime.now()

df_plano['DAT_ULT_ALT'] = pd.Series(list(itertools.repeat(dat_ult_alt, max)))
df_plano.to_sql('table_name', connection, if_exists='append', index=False)

Этот код работает с полями типа "Дата", но не работает с полями типа "отметка времени". Знаете ли вы, что мне нужно сделать, чтобы преобразовать dat_ult_alt в метку времени?

1 ответ

Ознакомьтесь с типами данных Oracle в документации sqlalchemy. В модуле sqlalchemy.dialects.oracle вы можете найти тип данных TIMESTAMP. Импортируйте его и установите как dtype для соответствующего столбца, как это.

from sqlalchemy.dialects.oracle import TIMESTAMP
df_plano.to_sql('table_name', connection, if_exists='append', index=False, dtype={'DAT_ULT_ALT':TIMESTAMP})

Не уверен насчет sqlalchemy, так как я никогда не использовал его с Oracle. Вот пример кода с использованием Cx_Oracle, который работает.

create table test ( tstamp TIMESTAMP);

import cx_Oracle
import datetime
conn = cx_Oracle.connect('usr/pwd@//host:1521/db')
cur = conn.cursor()
dtime=datetime.datetime.now()
cur.prepare( "INSERT INTO test(tstamp) VALUES(:ts)" )
cur.setinputsizes(ts=cx_Oracle.TIMESTAMP)
cur.execute(None, {'ts':dtime})
conn.commit()
conn.close()

select * from test;

TSTAMP                        
------------------------------
22-11-18 09:14:19.422278000 PM
Другие вопросы по тегам