Python - чтение типа BLOB из базы данных SQLite3 - PullRequest
2 голосов
/ 29 сентября 2011

Это продолжение из: Python - Преобразование Hex в INT / CHAR

Теперь у меня есть рабочее решение для преобразования сохраненного шестнадцатеричного значения IP из sqlite3 db в читаемый и пригодный для использования формат. Однако до сих пор я проводил тестирование, копируя и вставляя значения непосредственно из средства просмотра базы данных sqlite3.

Я пытался опросить базу данных с помощью скрипта для поиска этой информации, однако я обнаружил, что она хранит данные BLOB-объектов в буфере, который не сразу воспринимается человеком.

Например, IP 192.168.0.1 сохраняется как тип BLOB-объекта под полем ip как X'C0A80001 '

Поскольку я работал с скопированного и вставленного примера в свой код, я создал код, чтобы убрать X и 'из шестнадцатеричного кода, чтобы иметь возможность затем преобразовать его. Чего я не могу получить, так это значения из базы данных (X'C0A80001 '<- это значение, которое я могу просмотреть с помощью менеджера БД). Поиск Я нашел <a href="http://eli.thegreenplace.net/2009/05/29/storing-blobs-in-a-sqlite-db-with-pythonpysqlite/" rel="nofollow noreferrer">http://eli.thegreenplace.net/2009/05/29/storing-blobs-in-a-sqlite-db-with-pythonpysqlite/, который показал пример чтения больших двоичных объектов в базу данных sqlite и из нее, но их методы не работали. Они отображали ошибку;

print row[0], str(row[1]).encode('hex')
IndexError: tuple index out of range

Я довольно новичок в Python, поэтому извиняюсь, если мне не хватает чего-то простого, но любые указатели или примеры кода, которые кто-либо должен помочь мне разобраться в этом, были бы признательны.

EDIT: До, не вставил код из приведенного выше примера;

c = conn.cursor()
c.execute('select ip from item where name = ' + "\'" + host + "\'")
for row in c:
        print row[0], str(row[1]).encode('hex')

Может быть, я действительно понимаю, почему я не могу прочитать это так, как хочу

UPDATE: Используя ответ ниже, я изменил свой код на;

rows = c.execute('select ip from item where name= ' + "\"" + host + "\"") 
   for row in rows:
       print str(row[0]).encode("hex")

1 Ответ

3 голосов
/ 29 сентября 2011

После проверки ссылки, похоже, наиболее вероятное объяснение - пустая строка. В строке 29 вы устанавливаете цикл for для просмотра результатов запроса. В python это означает, что у вас есть список: [item,item2,item3] и каждый раз, когда вы проходите цикл, ваша переменная row указывает на следующий элемент.

В цикле вы проверяете содержимое текущего элемента. Каждый из этих элементов представляет собой кортеж, который предположительно имеет по меньшей мере две записи. Но если какой-либо из этих элементов не имеет записи для row[0] или row[1], вы получите исключение индекса из диапазона.

Вы не опубликовали достаточно кода, чтобы определить , почему это возможно, но для запуска кода я бы предложил следующее:

for row in cur.execute("select * from frames"):
    try:
        print row[0], str(row[1]).encode('hex') 
    except IndexError, e:
        print "IndexError: {0}".format(e)

Это будет продолжаться по всему результату запроса, даже если некоторые из них плохие.

Редактировать: Я только что видел ваше обновление, и ваша проблема в том, что c не содержит содержимое вашего запроса. c.execute('select ip from item where name = ' + "\'" + host + "\'") возвращает список, который вы игнорируете.

Исходный пример работает, потому что вы получаете список в цикле for, и поэтому это анонимная переменная только в контексте цикла . Чтобы исправить ваш код:

c = conn.cursor()
rows = c.execute('select ip from item where name = ' + "\'" + host + "\'")
for row in rows:
        print row[0], str(row[1]).encode('hex')
...