PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment réparer sqlalchemy.exc.DataError :(psycopg2.errors.StringDataRightTruncation) ?

L'image la colonne est déclarée comme étant caractère données d'une longueur maximale de 100, mais vous transmettez beaucoup plus de 100 octets de binaire données :

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'

Puisque vous utilisez Postgresql, vous pourriez déclarer image sans spécifier de longueur :

image = db.Column(db.String)

mais vous pouvez constater que vous avez des difficultés à gérer les données lorsqu'elles sont renvoyées de la base de données*.

Il serait préférable de déclarer image en tant que type BLOB (Binary Large OBject) :

image = db.Column(LargeBinary)

alors SQLAlchemy devrait renvoyer les octets comme prévu lors de la récupération des données.

Si vous modifiez la déclaration de colonne pour une base de données existante, vous devrez appliquer la modification à la base de données elle-même, soit en utilisant un outil comme Flask Migrate , ou directement dans la console psql :

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

* Cela fonctionnera pour sqlite, mais ne fera pas l'aller-retour correctement dans Postgresql - voir cette réponse pour plus de discussion à ce sujet.