0

DatabaseError: ORA-00904: "DAT_ULT_ALT": invalid identifier当我尝试使用带有 SQL Alchemy 引擎的 pandas 中的 to_sql 将日期时间插入 Oracle 中的时间戳时,我得到了。我的代码:

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 转换为时间戳吗?

4

2 回答 2

3

查看 sqlalchemy 文档的Oracle 数据类型。在模块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})
于 2020-09-30T11:32:47.327 回答
1

不确定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
于 2018-11-22T15:50:32.313 回答