Поле JSON
Тип JSON в SQLAlchemy представляет поле
для хранения данных в формате JSON. Он
позволяет сохранять в базе данных словари,
списки, строки, числа и логические значения,
а при чтении автоматически преобразует их
в соответствующие объекты Python.
Поле принимает значения в виде Python-объектов,
которые сериализуются в JSON при записи и
десериализуются обратно при чтении. Тип JSON
поддерживается большинством современных СУБД,
включая PostgreSQL, MySQL и SQLite.
Синтаксис
from sqlalchemy import JSON
column = mapped_column(JSON)
Пример
Давайте создадим модель с полем JSON и сохраним в нее словарь:
from sqlalchemy import create_engine, JSON
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[dict] = mapped_column(JSON)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(
title='article',
data={'status': 'published', 'num': 10}
)
session.add(article)
session.commit()
res = session.query(Article).first()
print(res.data)
Результат выполнения кода:
{'status': 'published', 'num': 10}
Пример
Поле JSON может хранить не только словари, но и списки. Давайте сохраним список строк:
from sqlalchemy import create_engine, JSON
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(JSON)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(
title='article',
tags=['sqlalchemy', 'python', 'orm']
)
session.add(article)
session.commit()
res = session.query(Article).first()
print(res.tags)
Результат выполнения кода:
['sqlalchemy', 'python', 'orm']
Пример
Давайте обратимся к отдельному ключу JSON-поля после его загрузки из базы данных:
from sqlalchemy import create_engine, JSON
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[dict] = mapped_column(JSON)
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(
title='article',
data={'status': 'draft', 'num': 5}
)
session.add(article)
session.commit()
res = session.query(Article).first()
print(res.data['status'])
print(res.data['num'])
Результат выполнения кода:
draft
5
Смотрите также
-
тип
JSONB,
который хранит JSON в бинарном формате PostgreSQL -
тип
ARRAY,
который хранит массивы значений -
тип
Text,
который хранит длинные текстовые строки -
тип
PickleType,
который хранит произвольные Python-объекты