Поле PickleType
Поле PickleType представляет собой
специальный тип данных, который позволяет
сохранять в колонке таблицы произвольные
Python-объекты. Перед записью в базу объект
сериализуется с помощью модуля pickle,
а при чтении - восстанавливается обратно.
Тип полезен, когда нужно хранить списки,
словари, кортежи или собственные экземпляры
классов, для которых нет отдельного
SQL-представления.
Поле принимает параметр protocol,
который задает версию протокола сериализации
pickle. По умолчанию используется
pickle.HIGHEST_PROTOCOL. Также можно
указать параметр pickler и
unpickler - собственные функции
сериализации и десериализации, если
стандартные не подходят.
Синтаксис
PickleType(protocol=pickle.HIGHEST_PROTOCOL, pickler=None, unpickler=None)
Пример
Давайте создадим модель с полем PickleType
и сохраним в нее список:
from sqlalchemy import create_engine, PickleType
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
tags: Mapped[list] = mapped_column(PickleType)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', tags=['python', 'sqlalchemy'])
session.add(article)
session.commit()
res = session.get(Article, article.id)
print(res.tags)
Результат выполнения кода:
['python', 'sqlalchemy']
Пример
Давайте сохраним в поле PickleType словарь
с настройками:
from sqlalchemy import create_engine, PickleType
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
options: Mapped[dict] = mapped_column(PickleType)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', options={'status': 'draft', 'num': 10})
session.add(article)
session.commit()
res = session.get(Article, article.id)
print(res.options)
print(res.options['status'])
Результат выполнения кода:
{'status': 'draft', 'num': 10}
"draft"
Пример
Давайте зададим явный протокол сериализации
через параметр protocol:
import pickle
from sqlalchemy import create_engine, PickleType
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
data: Mapped[tuple] = mapped_column(PickleType(protocol=pickle.DEFAULT_PROTOCOL))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', data=(1, 'text', True))
session.add(article)
session.commit()
res = session.get(Article, article.id)
print(res.data)
print(type(res.data))
Результат выполнения кода:
(1, 'text', True)
<class 'tuple'>
Пример
Давайте сохраним в PickleType экземпляр
пользовательского класса:
from sqlalchemy import create_engine, PickleType
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column, Session
class Base(DeclarativeBase):
pass
class Settings:
def __init__(self, status, num):
self.status = status
self.num = num
def __repr__(self):
return f'Settings(status={self.status!r}, num={self.num!r})'
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
settings: Mapped[Settings] = mapped_column(PickleType)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', settings=Settings('draft', 10))
session.add(article)
session.commit()
res = session.get(Article, article.id)
print(res.settings)
print(res.settings.status)
Результат выполнения кода:
Settings(status='draft', num=10)
"draft"
Смотрите также
-
тип
LargeBinary,
который хранит бинарные данные -
тип
JSON,
который хранит структуры в формате JSON -
тип
Text,
который хранит длинные строки -
тип
ARRAY,
который хранит массивы значений