Python cx_Oracle 插入带毫秒的时间戳。

问题描述 投票:0回答:1

我已经阅读了这些帖子。在Oracle中用cx_Oracle和Python 3.6插入毫秒的TIMESTAMP。 和 "在Oracle中用cx_Oracle和Python 3.6插入带有毫秒的TIMESTAMP "的帖子。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()

另一方面,我有多条记录要插入,比如25万条。所以,我需要获取所有的数据并将其转换为字典,最后将字典对象追加到一个列表中,以便在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)

Conveting 250k记录的效率很低。有其他的解决方案吗?

编辑:我想在不进行字典转换的情况下插入我的输出数据(outputql)。这是否可能;如果可能,那么怎么做?

先谢谢你

Ps:outputql是另一个db会话查询的输出,它返回的记录具有正确的毫秒精度。

cursorsql = connsql.cursor()
cursorsql.execute('select top 1  record_id, instance_id, record_id from dbo.recordlog  (nolock)')
outputsql = cursorsql.fetchall()
python oracle datetime timestamp cx-oracle
1个回答
1
投票

没有必要将你的数据转换为字典。该 文件 对于 cursor.setinputsizes() 显示你可以传递位置参数或关键字参数。所以,如果你需要表示第三列应该是时间戳,你可以做如下操作。

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

这样做的目的是说前两个绑定位置可以使用默认绑定。这将通过检查提供的数据来确定,当 cursor.execute()cursor.executemany() 被调用。第三个绑定位置将被绑定为一个时间戳列。

希望这一点足够清晰!

© www.soinside.com 2019 - 2024. All rights reserved.