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.