PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como corrigir sqlalchemy.exc.DataError:(psycopg2.errors.StringDataRightTruncation)?


A image coluna é declarada como sendo caractere dados com um comprimento máximo de 100, mas você está passando consideravelmente mais de 100 bytes de binário dados:
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 você estiver usando o Postgresql, você poderia declarar image sem especificar um comprimento:
image = db.Column(db.String)

mas você pode encontrar dificuldades para lidar com os dados quando retornados do banco de dados*.

Seria melhor declarar image como um tipo BLOB (Binary Large OBject):
image = db.Column(LargeBinary)

então SQLAlchemy deve retornar bytes conforme esperado ao recuperar dados.

Se você alterar a declaração da coluna para um banco de dados existente, precisará aplicar a alteração ao próprio banco de dados, usando uma ferramenta como Migração do Flask , ou diretamente no console do psql:
 ALTER TABLE ads ALTER COLUMN image TYPE bytea USING image::bytea;

* Isso funcionará para o sqlite, mas não funcionará corretamente no Postgresql - consulte esta resposta para mais discussão sobre isso.