Pickle serialize database

Serializa datos y los guarda en una base de datos.

Base de datos para el ejemplo

CREATE TABLE datas
(
  id serial NOT NULL,
  data_serializada text NOT NULL,
  CONSTRAINT pk_id_datas PRIMARY KEY (id)
)

Ejemplo serializando un único objeto

import pickle
import psycopg2

conn_string = 'dbname=practicas \
                user=snicoper \
                password=123456'


class Persona(object):

    def __init__(self, nombre, apellidos, email):
        self.nombre = nombre
        self.apellidos = apellidos
        self.email = email

persona = Persona('salvador', 'nicolas pereiro', 'snicoper@example.com')

# Guardar los datos en la db, pasar de bytes a str
data = pickle.dumps(persona, 0)
data = data.decode('utf-8')
with psycopg2.connect(conn_string) as conn:
    with conn.cursor() as cur:
        cur.execute(
            "INSERT INTO datas(data_serializada) \
            VALUES(%s)", (data,))
        conn.commit()

# Leer los datos
with psycopg2.connect(conn_string) as conn:
    with conn.cursor() as cur:
        cur.execute(
            "SELECT * FROM datas WHERE id = 1")
        datas = cur.fetchone()

# pasar de str a bytes
datas = datas[1].encode('utf-8')
p = pickle.loads(datas)
print(p.nombre)

Ejemplo serializando varios objetos a la vez

persona = Persona('salvador', 'nicolas pereiro', 'snicoper@example.com')
persona2 = Persona('perico', 'palote', 'perico@example.com')

# Guardar los datos en la db, pasar de bytes a str
data = pickle.dumps((persona, persona2), 0)
data = data.decode('utf-8')
with psycopg2.connect(conn_string) as conn:
    with conn.cursor() as cur:
        cur.execute(
            "INSERT INTO datas(data_serializada) \
            VALUES(%s) RETURNING id", (data,))
        conn.commit()
        last_id = cur.fetchone()[0]

# Leer los datos
with psycopg2.connect(conn_string) as conn:
    with conn.cursor() as cur:
        cur.execute(
            "SELECT * FROM datas \
            WHERE id=%s", (last_id,))
        datas = cur.fetchone()

# pasar de str a bytes
datas = datas[1].encode('utf-8')
p1, p2 = pickle.loads(datas)
print(type(p2))