Класс ColumnElement является фундаментальным
классом для всех элементов выражений в SQLAlchemy.
Он представляет собой любой элемент, который может
появиться в SQL-выражении: колонку, литерал, функцию
или арифметическую операцию. Все методы этого класса
позволяют строить сложные SQL-выражения через цепочки
вызовов и перегрузку операторов.
Синтаксис
from sqlalchemy import ColumnElement
column_element = ColumnElement()
Пример
Давайте создадим колонку и проверим, что она
является экземпляром класса ColumnElement:
from sqlalchemy import ColumnElement
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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
col = Article.title
print(isinstance(col, ColumnElement))
Результат выполнения кода:
True
Пример
Давайте применим метод like для поиска
статей по шаблону:
<+python+>
from sqlalchemy import create_engine, 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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article one', text='text', status='published', num=1),
Article(title='article two', text='text', status='draft', num=2),
])
session.commit()
stmt = select(Article).where(Article.title.like('article%'))
res = session.scalars(stmt).all()
for article in res:
print(article.title)
<-python+>
Результат выполнения кода:
article one
article two
Пример
Давайте применим метод in_ для фильтрации
по списку значений:
<+python+>
from sqlalchemy import create_engine, 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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article one', text='text', status='published', num=1),
Article(title='article two', text='text', status='draft', num=2),
Article(title='article three', text='text', status='published', num=3),
])
session.commit()
stmt = select(Article).where(Article.status.in_(['published']))
res = session.scalars(stmt).all()
for article in res:
print(article.title)
<-python+>
Результат выполнения кода:
article one
article three
Пример
Давайте применим метод label для
переименования колонки в выборке:
<+python+>
from sqlalchemy import create_engine, 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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add(Article(title='article one', text='text', status='published', num=1))
session.commit()
stmt = select(Article.title.label('article_title'))
res = session.execute(stmt).all()
for row in res:
print(row.article_title)
<-python+>
Результат выполнения кода:
article one
Пример
Давайте применим метод desc для
сортировки по убыванию:
<+python+>
from sqlalchemy import create_engine, 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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article one', text='text', status='published', num=1),
Article(title='article two', text='text', status='draft', num=2),
Article(title='article three', text='text', status='published', num=3),
])
session.commit()
stmt = select(Article).order_by(Article.num.desc())
res = session.scalars(stmt).all()
for article in res:
print(article.num)
<-python+>
Результат выполнения кода:
3
2
1
Пример
Давайте применим метод between для
фильтрации по диапазону значений:
<+python+>
from sqlalchemy import create_engine, 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]
text: Mapped[str]
status: Mapped[str]
num: Mapped[int]
engine = create_engine('sqlite:///:memory:')
Base.metadata.create_all(engine)
with Session(engine) as session:
session.add_all([
Article(title='article one', text='text', status='published', num=1),
Article(title='article two', text='text', status='draft', num=2),
Article(title='article three', text='text', status='published', num=3),
])
session.commit()
stmt = select(Article).where(Article.num.between(1, 2))
res = session.scalars(stmt).all()
for article in res:
print(article.num)
<-python+>
Результат выполнения кода:
1
2
Смотрите также
-
метод
like,
который выполняет поиск по шаблону
-
метод
in_,
который проверяет вхождение в список значений
-
метод
label,
который переименовывает колонку в выборке
-
метод
desc,
который задает сортировку по убыванию