如何在没有Python类型转换的情况下保存十六进制的文本字符串,即就像纯文本一样



Python 3.6, Sqlite3.

我有一些接受用户输入的代码,并将其存储为称为uinput的变量。我已经确认这是由 Python 保存为 Str 类型。

uinput = input ("enter the string: ")
print("Type of uinput is:",type(uinput))

给出输出

Type of uinput is: <class 'str'>

uinput 将始终是 0x 格式,然后是 40 个字符,或者只是 40 个字符(在尝试数据库更新之前,我有一些其他逻辑可以验证这一点 - 这个位正在工作(。

到目前为止,我的测试一直使用 0x 然后 40 个字符的格式,例如 0x689C56AEf474Df92D44A1B70850f808488F9769D

我知道我可以执行以下操作来删除 0x 前缀,因此 DB UPDATE 是一致的样式 如果 uinput.startswith(("0X", "0x"((: uinput=uinput[2:]

但是,当我尝试将其写入我的 Sqlite db 时,脚本冻结,我相信这是因为 Python 正在将十六进制转换为另一种格式,而不是将其作为字符串传递。

#conn2 declared earlier, and is available to this function
cur = conn2.cursor()
cur.execute("UPDATE db1 SET myhex=? WHERE ID=123", (uinput))
conn2.commit()

如果我在命令行上进入sqlite3并手动尝试UPDATE命令,则会出现以下错误: 错误:十六进制文字太大:0x689C56AEf474Df92D44A1B70850f808488F9769D

  • 这就是为什么我认为Python正在进行某种类型转换。

我想做的只是将其存储为字符串,就像 print(uinput( 命令显示的那样(我想它会在后台进行自己的类型转换!... 例如"0x689C56AEf474Df92D44A1B70850f808488F9769D"或"689C56AEf474Df92D44A1B70850f808488F9769C",两者都可以。

它需要采用这种格式,因为数据库是人类可读的(通过 csv 导出(,所以我不想再次转换它来获取用户最初提交的 ascii(

我相信这将是一件简单的事情,但我在这个问题上花了将近 2 个小时,我已经没有想法了!

谢谢

今天睡在上面并以新鲜的大脑接近它,我找到了一个似乎有效的解决方案。

cur = conn2.cursor()
sql_query= "UPDATE db1 SET myhex=? WHERE ID=123"
cur.execute(sql_query, (str(uinput))
conn2.commit()

。基本上在执行期间强制变量为字符串。

我之前尝试过这种变体,并猜测它的解析方式一定存在细微差异。

cur.execute("UPDATE db1 SET myhex=? WHERE ID=123", (str(uinput)))

^^^这不起作用

最新更新