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

发布于 2024-12-27 11:03:36 字数 501 浏览 1 评论 0原文

我有一个包含 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之前,我需要将值转换为python中的二进制吗?如果是的话怎么办?注意,相同的 sql 可以与cursor.execute 和单个值一起正常工作,只是与我遇到问题的列表有关。

I have text file containing a list of 16 bit hex numbers (e.g. '61C7393AA9B3474DB081C7B7CCE1C545') and I need to insert them an Oracle RAW column using cx_Oracle.
I tried this:

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)

but it fails with cx_Oracle.DatabaseError: ORA-01036: illegal variable name/number.
Do I need to convert the values to binary in python before calling executemany ? And if so how? NB the same sql works fine with cursor.execute and a single value, it just with the list that I'm having problems.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

岁月流歌 2025-01-03 11:03:36

好吧,我已经通过几种方式解决了这个问题。首先,上面的代码是不正确的,因为它创建了一个值列表,而它应该创建一个元组列表。即

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)

Well, I've solved it, in a couple of ways. Firstly, the code above is incorrect as it creates a list of values whereas it should be creating a list of tuples. i.e.

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

and then using

cursor.setinputsizes(cx_Oracle.STRING)

it works.
On the original question - how to get rid of the hextoraw, I found that this works:

import base64
ids = [(base64.b16decode(l.strip()),) for l in guidfile.readlines()]
cursor.setinputsizes(cx_Oracle.BINARY)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文