Python 3.6, Sqlite3.
У меня есть некоторый код, который принимает пользовательский ввод и сохраняет его как переменную с именем uinput. Я подтвердил, что это сохранено как тип Str Python.
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 - это непротиворечивый стиль.
if uinput.startswith (("0X", "0x")):
uinput = uinput [2:]
Однако, когда я пытаюсь записать это в мою базу данных Sqlite, сценарий останавливается, что, как я полагаю, связано с тем, что Python преобразовывает Hex в другой формат вместо передачи его в виде строки.
#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 часа только на эту проблему, и у меня заканчиваются идеи!
Спасибо