PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie behebt man sqlalchemy.exc.DataError:(psycopg2.errors.StringDataRightTruncation)?

Das image Spalte wird als Zeichen deklariert Daten mit einer maximalen Länge von 100, aber Sie übergeben deutlich mehr als 100 Bytes binär Daten:

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'

Da Sie Postgresql verwenden, könnten Sie dies tun deklarieren Sie image ohne Längenangabe:

image = db.Column(db.String)

Es kann jedoch vorkommen, dass Sie Schwierigkeiten bei der Handhabung der Daten haben, wenn sie aus der Datenbank zurückgegeben werden*.

Es wäre besser, image zu deklarieren als BLOB (Binary Large OBject) geben Sie ein:

image = db.Column(LargeBinary)

dann sollte SQLAlchemy beim Abrufen von Daten wie erwartet Bytes zurückgeben.

Wenn Sie die Spaltendeklaration für eine vorhandene Datenbank ändern, müssen Sie die Änderung auf die Datenbank selbst anwenden, entweder mit einem Tool wie Flask-Migration , oder direkt in der psql-Konsole:

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

* Dies funktioniert für sqlite, führt jedoch in Postgresql keinen korrekten Roundtrip durch - siehe diese Antwort für weitere Diskussionen zu diesem Thema.