sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo reparar sqlalchemy.exc.DataError:(psycopg2.errors.StringDataRightTruncation)?

La image la columna se declara como carácter datos con una longitud máxima de 100, pero está pasando considerablemente más de 100 bytes de binary datos:

b'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x05V\x00\x00\x03\x00\x08\x06\x00\x00\x00\xcf><\xc2\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x ... (1331901 characters truncated) ... 1l!+\x1d\xe9I6\xfa\x80*_n\xa7\x10\xf5c\x1e;\xf8:\xea\xb3c\xed\xd2+\xf3\xc6*\xa9\xbe\xbe\xde\xfe\x1f\x1e\xa5\xb3\xc5S^Y\x00\x00\x00\x00IEND\xaeB\x82'

Dado que está utilizando Postgresql, podría declarar image sin especificar una longitud:

image = db.Column(db.String)

pero es posible que tenga dificultades para manejar los datos cuando los devuelve de la base de datos*.

Sería mejor declarar image como tipo BLOB (Binary Large OBject):

image = db.Column(LargeBinary)

entonces SQLAlchemy debería devolver bytes como se esperaba al recuperar datos.

Si cambia la declaración de columna para una base de datos existente, deberá aplicar el cambio a la base de datos misma, ya sea usando una herramienta como Migración de Flask , o directamente en la consola psql:

 ALTER TABLE ads ALTER COLUMN image TYPE bytea USING image::bytea;

* Esto funcionará para sqlite, pero no funcionará correctamente en Postgresql; consulte esta respuesta para más discusión sobre esto.