sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur fixar jag sqlalchemy.exc.DataError:(psycopg2.errors.StringDataRightTruncation)?

image kolumnen deklareras som tecken data med en maximal längd på 100, men du skickar betydligt mer än 100 byte binär data:

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'

Om du använder Postgresql, kan du deklarera image utan att ange en längd:

image = db.Column(db.String)

men du kan upptäcka att du har svårt att hantera data när den returneras från databasen*.

Det skulle vara bättre att deklarera image som en BLOB (Binary Large OBject) typ:

image = db.Column(LargeBinary)

då ska SQLAlchemy returnera bytes som förväntat när data hämtas.

Om du ändrar kolumndeklarationen för en befintlig databas måste du tillämpa ändringen på själva databasen, antingen med ett verktyg som Migrera kolv , eller direkt i psql-konsolen:

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

* Detta kommer att fungera för sqlite, men kommer inte att återvända korrekt i Postgresql - se det här svaret för mer diskussion kring detta.




  1. Java JDBC ignorerar setFetchSize?

  2. Multitenancy-alternativ för PostgreSQL

  3. MySQL-inlärningsväg

  4. Kan någon förklara denna SQL? (och hur kan jag "parametrisera" det och anropa som en funktion?)