Тип ARRAY
Тип ARRAY создает колонку, которая хранит
массив значений одного типа. Первым параметром
передается тип элементов массива, например
Integer
или String.
Тип поддерживается СУБД PostgreSQL и некоторыми
другими базами данных.
Синтаксис
ARRAY(item_type, [as_tuple], [dimensions], [zero_indexes])
Пример
Давайте создадим таблицу с колонкой-массивом целых чисел:
from sqlalchemy import create_engine, Integer, ARRAY
from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
class Base(DeclarativeBase):
pass
class Article(Base):
__tablename__ = 'articles'
id: Mapped[int] = mapped_column(primary_key=True)
title: Mapped[str]
nums: Mapped[list[int]] = mapped_column(ARRAY(Integer))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
print(Article.__table__.columns['nums'].type)
Результат выполнения кода:
"INTEGER[]"
Пример
Давайте вставим в колонку-массив список значений и прочитаем его обратно:
<+python+>
from sqlalchemy import create_engine, Integer, ARRAY, select
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]
nums: Mapped[list[int]] = mapped_column(ARRAY(Integer))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', nums=[1, 2, 3])
session.add(article)
session.commit()
res = session.scalars(select(Article)).first()
print(res.nums)
<-python+>
Результат выполнения кода:
[1, 2, 3]
Пример
Давайте создадим массив строк с помощью типа
String:
<+python+>
from sqlalchemy import create_engine, String, ARRAY, select
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[str]] = mapped_column(ARRAY(String))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
article = Article(title='article', tags=['user', 'sqlalchemy'])
session.add(article)
session.commit()
res = session.scalars(select(Article)).first()
print(res.tags)
<-python+>
Результат выполнения кода:
['user', 'sqlalchemy']
Пример
Давайте отфильтруем строки по наличию значения
в массиве с помощью метода contains:
<+python+>
from sqlalchemy import create_engine, Integer, ARRAY, select
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]
nums: Mapped[list[int]] = mapped_column(ARRAY(Integer))
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article 1', nums=[1, 2, 3]),
Article(title='article 2', nums=[4, 5, 6]),
])
session.commit()
res = session.scalars(
select(Article).where(Article.nums.contains([1, 2, 3]))
).all()
print([article.title for article in res])
<-python+>
Результат выполнения кода:
['article 1']
Смотрите также
-
тип
JSON,
который хранит структурированные данные -
тип
Integer,
который часто используется как элемент массива -
тип
String,
который задает тип элементов строкового массива -
тип
LargeBinary,
который хранит бинарные данные