使用 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.datetime
(datetime
模块的一种),按顺序统计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()
我想将数据插入 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.datetime
(datetime
模块的一种),按顺序统计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()