PostgreSQL 有一种称为
bytea
的数据类型。这是他们的 blob 版本。
在显示图像,png/jpg/gif时,当前的趋势是使用Data URLs。
我的问题是如何将 bytea 值转换为 Base64 Data URL 值?
您还可以从数据库中获取完整的图像数据 URL,例如:
SELECT 'data:image/gif;base64,' || encode(image_data, 'base64') AS image_url
FROM ...
$img_bin = hex2bin(substr($the_bytea, 2));
$url = 'data:image/gif;base64,' . base64_encode($img_bin);
Postgres bytea 是一个以
\x
开头,后跟十六进制字符的字符串。要获取二进制格式的图像,需要去掉前导的 \x
并使用 hex2bin
将十六进制字符转换为二进制。现在您已经有了二进制文件,您可以base64_encode
它。
发布此答案,以防有人在使用 Postgres 和 sqlalchemy 时遇到问题。感谢其他答案帮助我走到这一步。
我能够使用上面 clemens 提供的答案,并将 sql 放入 column_property 中,并利用literal_column 插入 rawsql 语句。
class Attachment(BaseModel):
__tablename__ = "attachments"
id = Column(UUID(), primary_key=True, default=uuid.uuid4, )
data = Column(BYTEA(), nullable=True)
text = Column(Text, nullable=True)
file_name = Column(String(255), nullable=True)
content_type = Column(String(255), nullable=True)
model = Column(String(255), nullable=False)
model_id = Column(UUID(), nullable=False, index=True)
meta_data = Column(JSON, nullable=True)
deleted = Column(BOOLEAN, default=False)
# return a data url when the attachment is an image, doesnt work in sqlite
image_url = column_property(
literal_column("""
CASE
WHEN content_type LIKE 'image%' THEN 'data:image/gif;base64,' || encode(data, 'base64')
ELSE null
END
""", type_=String).label("image_url")
)