Как сохранить текстовую строку Hex без преобразования типа Python, т.е. как обычный текст - PullRequest
0 голосов
/ 01 сентября 2018

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 часа только на эту проблему, и у меня заканчиваются идеи!

Спасибо

1 Ответ

0 голосов
/ 01 сентября 2018

Спал на нем и подошел к нему с новым умом сегодня, я нашел решение, которое, кажется, работает.

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)))

^^^ это не сработало

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...