Используя SQLite3 в Python, я пытаюсь сохранить сжатую версию фрагмента HTML-кода UTF-8.
Код выглядит так:
...
c = connection.cursor()
c.execute('create table blah (cid integer primary key,html blob)')
...
c.execute('insert or ignore into blah values (?, ?)',(cid, zlib.compress(html)))
В этот момент получите ошибку:
sqlite3.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.
Если я использую «текст», а не «blob», и не сжимаю фрагмент HTML, он работает нормально (хотя db слишком велик). Когда я использую blob и сжимаю через библиотеку Python zlib, я получаю указанное выше сообщение об ошибке. Я огляделась, но не нашла простого ответа на этот вопрос.
Нашел решение, мне следовало потратить еще немного времени на поиски.
Решение состоит в том, чтобы «преобразовать» значение в «буфер» Python, например:
c.execute('insert or ignore into blah values (?, ?)',(cid, buffer(zlib.compress(html))))
Надеюсь, это поможет кому-нибудь другому.
источник
Чтобы работать с типом BLOB, вы должны сначала преобразовать сжатую строку zlib в двоичные данные - иначе sqlite попытается обработать ее как текстовую строку. Это делается с помощью sqlite3.Binary (). Например:
c.execute('insert or ignore into blah values (?, ?)',(cid, sqlite3.Binary(zlib.compress(html))))
источник
Синтаксис:
5 типов возможного хранения: NULL, INTEGER, TEXT, REAL и BLOB
BLOB обычно используется для хранения маринованных моделей или маринованных с укропом моделей.
> cur.execute('''INSERT INTO Tablename(Col1, Col2, Col3, Col4) VALUES(?,?,?,?)''', [TextValue, Real_Value, Buffer(model), sqlite3.Binary(model2)]) > conn.commit() > # Read Data: > df = pd.read_sql('SELECT * FROM Model, con=conn) > model1 = str(df['Col3'].values[0])) > model2 = str(df['Col'].values[0]))
источник
Вы можете сохранить значение, используя repr (html) вместо необработанного вывода, а затем использовать eval (html) при получении значения для использования.
c.execute('insert or ignore into blah values (?, ?)',(1, repr(zlib.compress(html))))
источник