Поле BLOB
Поле BLOB (Binary Large Object) представляет
собой тип данных для хранения больших объемов
бинарной информации: изображений, аудио, видео,
сериализованных объектов. В SQLAlchemy данный
тип реализован классом BLOB, который
наследуется от LargeBinary. Первым
параметром передается длина поля в символах
length, которая используется некоторыми
СУБД для определения размера колонки.
В отличие от текстовых типов, данные BLOB
не подвергаются кодировке и сохраняются
в байтовом виде.
Синтаксис
from sqlalchemy import BLOB
BLOB(length)
Пример
Давайте создадим таблицу с полем BLOB
и сохраним в него бинарные данные:
from sqlalchemy import create_engine, BLOB, Integer, String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String(50))
data: Mapped[bytes] = mapped_column(BLOB)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', data=b'\x01\x02\x03\x04')
session.add(article)
session.commit()
res = session.scalar(select(Article).where(Article.title == 'article'))
print(res.data)
Результат выполнения кода:
b'\x01\x02\x03\x04'
Пример
Давайте сохраним в поле BLOB текстовые
данные, закодированные в байты, и проверим
их длину:
from sqlalchemy import create_engine, BLOB, Integer, String, select
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(Integer, primary_key=True)
title: Mapped[str] = mapped_column(String(50))
payload: Mapped[bytes] = mapped_column(BLOB(255))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', payload='user data'.encode('utf-8'))
session.add(article)
session.commit()
res = session.scalar(select(Article).where(Article.title == 'article'))
print(len(res.payload))
Результат выполнения кода:
9
Смотрите также
-
класс
LargeBinary,
который хранит бинарные данные произвольной длины -
класс
PickleType,
который автоматически сериализует Python-объекты -
класс
String,
который хранит текстовые данные фиксированной длины -
класс
Text,
который хранит текстовые данные произвольной длины