Używając SQLite3 w Pythonie, próbuję przechowywać skompresowaną wersję fragmentu kodu HTML UTF-8.
Kod wygląda następująco:
...
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)))
W którym momencie pojawi się błąd:
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.
Jeśli użyję „tekstu” zamiast „bloba” i nie kompresuję fragmentu kodu HTML, wszystko działa dobrze (choć db jest za duży). Kiedy używam „blob” i kompresuję przez bibliotekę Python zlib, pojawia się powyższy komunikat o błędzie. Rozejrzałem się, ale nie mogłem znaleźć prostej odpowiedzi na to pytanie.
Znalazłem rozwiązanie, powinienem był poświęcić trochę więcej czasu na szukanie.
Rozwiązaniem jest „rzutowanie” wartości jako „bufor” Pythona, na przykład:
c.execute('insert or ignore into blah values (?, ?)',(cid, buffer(zlib.compress(html))))
Mam nadzieję, że pomoże to komuś innemu.
źródło
Aby pracować z typem BLOB, musisz najpierw przekonwertować skompresowany ciąg zlib na dane binarne - w przeciwnym razie sqlite spróbuje przetworzyć go jako ciąg tekstowy. Odbywa się to za pomocą sqlite3.Binary (). Na przykład:
c.execute('insert or ignore into blah values (?, ?)',(cid, sqlite3.Binary(zlib.compress(html))))
źródło
Składnia:
5 możliwych typów przechowywania: NULL, INTEGER, TEXT, REAL i BLOB
BLOB jest zwykle używany do przechowywania modeli marynowanych lub modeli marynowanych z koperkiem
> 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]))
źródło
Możesz zapisać wartość za pomocą repr (html) zamiast surowych danych wyjściowych, a następnie użyć eval (html) podczas pobierania wartości do użycia.
c.execute('insert or ignore into blah values (?, ?)',(1, repr(zlib.compress(html))))
źródło