PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come risolvere sqlalchemy.exc.DataError:(psycopg2.errors.StringDataRightTruncation)?

L'image la colonna è dichiarata come carattere dati con una lunghezza massima di 100, ma stai passando molto più di 100 byte di binario dati:

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'

Se stai usando Postgresql, potresti dichiara image senza specificare una lunghezza:

image = db.Column(db.String)

ma potresti riscontrare difficoltà nella gestione dei dati quando vengono restituiti dal database*.

Sarebbe meglio dichiarare image come tipo BLOB (Binary Large OBject):

image = db.Column(LargeBinary)

quindi SQLAlchemy dovrebbe restituire i byte come previsto durante il recupero dei dati.

Se modifichi la dichiarazione di colonna per un database esistente, dovrai applicare la modifica al database stesso, utilizzando uno strumento come Migrazione pallone o direttamente nella console psql:

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

* Funzionerà per sqlite, ma non funzionerà correttamente in Postgresql - vedi questa risposta per ulteriori discussioni su questo argomento.