如何在Python中将十六进制字符串转换为二进制以便使用cx_oracle插入

0 投票
1 回答
1588 浏览
提问于 2025-04-17 10:23

我有一个文本文件,里面包含了一些16位的十六进制数字(比如 '61C7393AA9B3474DB081C7B7CCE1C545'),我需要用cx_Oracle把这些数字插入到Oracle数据库的RAW列中。

我试过这样做:

sql = "INSERT INTO GUIDS VALUES (HEXTORAW(:1))"
ids = [l.strip() for l in guidfile.readlines()]
cursor.bindarraysize = len(ids)
cursor.setinputsizes(cx_Oracle.BINARY)
cursor.executemany(sql, ids)

但是出现了错误,提示是cx_Oracle.DatabaseError: ORA-01036: 非法的变量名/数字。我需要在调用executemany之前把这些值转换成二进制格式吗?如果需要的话,该怎么做呢?另外,使用cursor.execute和单个值时,那个SQL语句是可以正常工作的,只有在处理列表时我遇到了问题。

1 个回答

0

好吧,我解决了这个问题,有几种方法。首先,上面的代码是错误的,因为它创建了一个值的列表,而应该创建一个元组的列表。也就是说:

ids = [(l.strip(),) for l in guidfile.readlines()]

然后使用

cursor.setinputsizes(cx_Oracle.STRING)

这样就可以了。关于原来的问题——如何去掉hextoraw,我发现这样做是有效的:

import base64
ids = [(base64.b16decode(l.strip()),) for l in guidfile.readlines()]
cursor.setinputsizes(cx_Oracle.BINARY)

撰写回答