sql >> Database >  >> RDS >> PostgreSQL

Hoe sqlalchemy.exc.DataError te repareren:(psycopg2.errors.StringDataRightTruncation)?

De image kolom is gedeclareerd als karakter gegevens met een maximale lengte van 100, maar u passeert aanzienlijk meer dan 100 bytes binair gegevens:

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'

Aangezien u Postgresql gebruikt, zou declareren image zonder een lengte op te geven:

image = db.Column(db.String)

maar het kan zijn dat u problemen ondervindt bij het verwerken van de gegevens wanneer deze uit de database* worden geretourneerd.

Het zou beter zijn om image . te declareren als een BLOB-type (Binary Large OBject):

image = db.Column(LargeBinary)

dan zou SQLAlchemy bytes moeten retourneren zoals verwacht bij het ophalen van gegevens.

Als u de kolomdeclaratie voor een bestaande database wijzigt, moet u de wijziging toepassen op de database zelf, ofwel met een tool zoals Flask migreren , of rechtstreeks in de psql-console:

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

* Dit werkt voor sqlite, maar wordt niet correct teruggestuurd in Postgresql - zie dit antwoord voor meer discussie hierover.




  1. MySQL Group van kwartalen naar periodes

  2. Hoe 0 te retourneren in plaats van null bij gebruik van COUNT in MySQL

  3. Hoe kan ik de 10e, 20e, 30e ... rij van het resultaat van een andere selectiequery selecteren?

  4. Waarom kan een nieuwe gebruiker in PostgreSQL verbinding maken met alle databases?