使用 Python 脚本将数据插入 Oracle table。预期的 str 实例,找到字节

Insert data into Oracle table Using Python script. Expected str instance, bytes found

我想将数据插入 Oracle Table,其中一行类型为 RAW(In python BYTES)。

sql = f"INSERT /*+ APPEND */ INTO {table}  ({columns}) VALUES  ({values})"
ins_r = ', '.join(lst)
cur.execute(sql, ins_r)

这是我打印的 SQL:

INFO - INSERT /*+ APPEND */ INTO TR.ZZ_TEST  (REGION_ID, REGION_NAME, CHANGE_DATE, MD5) VALUES  (:REGION_ID, :REGION_NAME, :CHANGE_DATE, :MD5)

这是我要插入的数据:

['1', "'TEST'", "to_date('2021-09-28 18:48:23','YYYY-MM-DD HH24:MI:SS')", b'aWQ\x9b\xa6(\x17zj\xab\x97\x8e\x12uE4']

我有错误:

ins_r = ', '.join(lst)
TypeError: sequence item 3: expected str instance, bytes found

我想将 bytes 转换为 str,但不正确。

cur.execute() 的第二个参数应该是值列表,而不是将它们连接起来的字符串。所以使用

cur.execute(sql, lst)

您可以将参数转换为元组列表,以便能够插入多个值,同时使用 executemany 方法而不是 execute 方法,因为对于批量加载而言性能更高。

将DB当前的to_date转换为datetime.datetimedatetime模块的一种),按顺序统计columns字符串中逗号的个数生成绑定变量列表(values -> 在本例中为 :0, :1, :2, :3

import cx_Oracle
import datetime
...
...
table = 'tr.zz_test'
columns = 'region_id,region_name,change_date,md5'
prm=[    
    (11,'TEST1',datetime.datetime(2021, 9, 29, 17, 28, 11),b'aWQ\x9b\xa6(\x17zj\xab\x97\x8e\x12uE4'),
    (12,'TEST2',datetime.datetime(2021, 9, 28, 18, 48, 23),b'aWQ\x9b\xa5(\x17zj\xab\x97\x8e\x12uE2')
]

val=""
for i in range(0,columns.count(",")+1):
    val+=':'.join(' '+str(i)) + ','
values=val.rstrip(",")
my_query = f"INSERT /*+ APPEND */ INTO {table}({columns}) VALUES({values})"

cur.executemany(my_query,prm)
con.commit()