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

时间:2018-08-31 21:59:07

标签: python-3.x sqlite hex

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数据库时,脚本冻结了,我认为这是因为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个小时,而且我的想法已经用光了!

谢谢

1 个答案:

答案 0 :(得分:0)

我睡着了,今天有了新鲜的头脑,我找到了一个似乎可行的解决方案。

chmod 440 /etc/sudoers

...在执行过程中基本上将变量强制为字符串。

我以前尝试过这种方法的一种变体,但猜测它的解析方式肯定有细微的差别。

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

^^^这不起作用