2017-01-01 2 views
0

Использование Python 2.7, я храню веб-страниц в SQLite в столбец типа BLOB:разархивировав BLOB из SQLite с Python

Компрессия с Zlib, и я вставив его как тип sqlite3.Binary.

Без сжатия это работает отлично:

db_body = sqlite3.Binary(page_body) 
dbc.execute("insert into table (content) values ?", db_body) 

С компрессией работает отлично:

db_body = sqlite3.Binary(zlib.compress(page_body)) 
dbc.execute("insert into table (content) values ?", db_body) 

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

dbc.execute("select content from table limit 1") 
sql_result = dbc.fetchone() 

page_content = zlib.decompress(sql_result[0]) 

Но результат (page_content) тип Обл, который по-прежнему сжаты. Ошибок и исключений нет. Тип содержимого sql_result[0] - это Buffer, поэтому функция распаковки меняет тип данных, но не содержимое.

Если сжать и пережать в то же время, не подвергая его через SQLite, выход нормально:

db_body = sqlite3.Binary(zlib.compress(page_body)) 
page_content = zlib.decompress(db_body) 

Итак, как же я распаковывать данные, которые я вставил, а затем извлекаемые из SQLite?

+0

Как вы получаете squl_result? Укажите минимальный, полный и проверенный пример: https://stackoverflow.com/help/mcve – Setop

ответ

1

Вы уверены, что вам нужно использовать sqlite3.Binary?

db = sqlite3.connect('/tmp/mydb') 
db.execute('CREATE TABLE tbl (bin_clmn BLOB)') 
db.execute('INSERT INTO tbl VALUES(?)', [buffer(zlib.compress(page_body))]) 
db.commit() 
db.close() 


db = sqlite3.connect('/tmp/mydb') 
row = db.execute('SELECT * FROM tbl').fetchone() 
page_body_decompressed = zlib.decompress(str(row[0])) 
print page_body == page_body_decompressed 
+0

Спасибо, это работает. Похоже, странное поведение; sqlite3.Binary type - тот, который я где-то читал, как предназначен для хранения двоичных данных. –

Смежные вопросы