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

Sådan rettes sqlalchemy.exc.DataError:(psycopg2.errors.StringDataRightTruncation)?

image kolonne erklæres som værende tegn data med en maksimal længde på 100, men du passerer betydeligt mere end 100 bytes 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'

Når du bruger Postgresql, kunne du erklære image uden at angive en længde:

image = db.Column(db.String)

men du kan opleve, at du har problemer med at håndtere dataene, når de returneres fra databasen*.

Det ville være bedre at erklære image som en BLOB (Binary Large OBject) type:

image = db.Column(LargeBinary)

så skal SQLAlchemy returnere bytes som forventet, når data hentes.

Hvis du ændrer kolonneerklæringen for en eksisterende database, skal du anvende ændringen på selve databasen, enten ved at bruge et værktøj som Migrering af kolbe , eller direkte i psql-konsollen:

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

* Dette vil fungere for sqlite, men vil ikke rundrejse korrekt i Postgresql - se dette svar for mere diskussion omkring dette.




  1. MySql:Gem flervalgsdata i databasen

  2. MYSQL Bruger Spatial Index

  3. Hvordan undslipper jeg et reserveret ord i Oracle?

  4. INSERT Statement i PL/SQL mislykkes i Oracle-databasen