Hola, tengo este código que produce un archivo txt con una cadena de compresión que se insertará en una base de datos de postgres
def test_insert(): str_test = '4 1 2\n 2 4 5\n'.encode('utf8') cmpstr = zlib.compress(str_test) str_test_to_write = '\\x' + cmpstr.encode('hex_codec') with open('outfile.txt','w') as output_file: output_file.write(str(1) + '|'+ str_test_to_write + '\n') output_file.write(str(2) + '|'+ str_test_to_write + '\n')Luego uso el comando copiar para cargar la información en mi tabla:
time cat outfile.txt |psql teste3 -c "\copy zstr(id,zstr) from stdout with delimiter '|'"Esta es mi tabla:
drop table if exists zstr; create table zstr( id int, zstr bytea, primary key(id));Luego quiero seleccionar mis cadenas pero recibo este error:
>>> import psycopg2 >>> import zlib >>> con = psycopg2.connect(host = 'X', database = 'Y', user = 'Z') >>> con.autocommit = True >>> cur = con.cursor() >>> cur.execute('select * from zstr where id = 1') >>> row = cur.fetchone() >>> row (1, <read-only buffer for 0x7fe19b75f270, size 41, offset 0 at 0x7fe196976f30>) >>> a = str(row[1]) >>> q = zlib.decompress(a) Traceback (most recent call last): File "<stdin>", line 1, in <module> zlib.error: Error -3 while decompressing data: incorrect header checkEntonces, ¿cómo puedo obtener mis cuerdas?
La salida que quiero:
'4 1 2\n 2 4 5\n'Casi no hay razón para hacer esto. PostgreSQL comprime naturalmente el texto, con LZ, si el valor es mayor que TOAST_TUPLE_THRESHOLD. De los documentos en TOAST
El código de gestión TOAST se activa solo cuando el valor de una fila que se va a almacenar en una tabla es más ancho que los bytes TOAST_TUPLE_THRESHOLD (normalmente 2 kB). El código TOAST comprimirá y/o moverá los valores de los campos fuera de línea hasta que el valor de la fila sea más corto que los bytes TOAST_TUPLE_TARGET (también normalmente 2 kB) o no se puedan obtener más ganancias. Durante una operación de ACTUALIZACIÓN, los valores de los campos sin modificar normalmente se conservan tal cual; por lo tanto, una ACTUALIZACIÓN de una fila con valores fuera de línea no incurre en costos TOAST si ninguno de los valores fuera de línea cambia.
Lo hace de forma transparente para el usuario. Simplemente almacene el texto en sí.