РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
386 of 711 menu

Поле 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,
    который хранит массивы значений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить