sql >> Databáze >  >> RDS >> PostgreSQL

Jak opravit chybu sqlalchemy.exc.DataError:(psycopg2.errors.StringDataRightTruncation)?

image sloupec je deklarován jako znak data o maximální délce 100, ale předáváte podstatně více než 100 bajtů binárního údaje:

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'

Pokud používáte Postgresql, mohli byste deklarovat image bez určení délky:

image = db.Column(db.String)

ale můžete zjistit, že máte potíže se zpracováním dat při návratu z databáze*.

Bylo by lepší deklarovat image jako typ BLOB (Binary Large OBject):

image = db.Column(LargeBinary)

pak by SQLAlchemy měla při načítání dat vracet bajty podle očekávání.

Pokud změníte deklaraci sloupců pro existující databázi, budete muset změnu aplikovat na samotnou databázi, buď pomocí nástroje jako Migrace z lahvičky nebo přímo v konzole psql:

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

* Bude to fungovat pro sqlite, ale nebude to fungovat správně v Postgresql – viz tato odpověď pro další diskusi o tomto.




  1. DataTable s Ajaxem nefunguje dobře po použití serverSide:true

  2. Jak zkontrolovat, zda mysqli_query smazal nějaké řádky

  3. SQL Select Distinct

  4. AKTUALIZUJTE celý řádek v PL/pgSQL