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
我要做的就是将其存储为字符串,就像print(uinput)命令显示的一样(不过我猜想它会在后台进行自己的类型转换!)... 例如“ 0x689C56AEf474Df92D44A1B70850f808488F9769D”或“ 689C56AEf474Df92D44A1B70850f808488F9769C”。
它必须采用这种格式,因为数据库是人类可读的(通过csv导出),所以我不想再次将其转换回以获取最初由用户提交的ascii)
我敢肯定这将是一件简单的事,但是我已经在这个问题上花费了将近2个小时,而且我的想法已经用光了!
谢谢
答案 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()
^^^这不起作用