PostgreSQL具有此数据类型,称为bytea
。这是他们的版本 blob 。
在显示图像,png/jpg/gif时,当前的趋势是使用数据URL 。
我的问题是如何将BYTEA值转换为基本64数据URL值?
参考
- bytea-二进制数据类型。PostgreSQL 9.6文档
- 数据URL-将图像复制为Umar Hansa的数据URI。Google开发人员。2015年5月
您也可以从数据库中获取完整的图像数据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并利用Lirtal_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")
)