Метод slice класса Select
Метод slice класса Select создает
срез выборки, ограничивая количество возвращаемых
строк диапазоном индексов. Метод принимает три
параметра: start, stop и step.
Параметры start и step могут быть
равны None. Метод работает аналогично
встроенной функции slice в Python и
преобразуется в SQL-конструкции LIMIT
и OFFSET.
Синтаксис
Select.slice(start, stop, step)
Пример
Давайте создадим таблицу articles и
ограничим выборку первыми тремя строками:
from sqlalchemy import create_engine, select, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1'},
{'id': 2, 'title': 'article 2'},
{'id': 3, 'title': 'article 3'},
{'id': 4, 'title': 'article 4'},
{'id': 5, 'title': 'article 5'},
])
stmt = select(articles).slice(0, 3)
res = conn.execute(stmt).fetchall()
for row in res:
print(row.title)
Результат выполнения кода:
'article 1'
'article 2'
'article 3'
Пример
Давайте пропустим первые две строки и получим
следующие три, передав параметры start
и stop:
from sqlalchemy import create_engine, select, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1'},
{'id': 2, 'title': 'article 2'},
{'id': 3, 'title': 'article 3'},
{'id': 4, 'title': 'article 4'},
{'id': 5, 'title': 'article 5'},
])
stmt = select(articles).slice(2, 5)
res = conn.execute(stmt).fetchall()
for row in res:
print(row.title)
Результат выполнения кода:
'article 3'
'article 4'
'article 5'
Пример
Давайте используем параметр step, чтобы
выбрать каждую вторую строку:
from sqlalchemy import create_engine, select, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1'},
{'id': 2, 'title': 'article 2'},
{'id': 3, 'title': 'article 3'},
{'id': 4, 'title': 'article 4'},
{'id': 5, 'title': 'article 5'},
])
stmt = select(articles).slice(0, 5, 2)
res = conn.execute(stmt).fetchall()
for row in res:
print(row.title)
Результат выполнения кода:
'article 1'
'article 3'
'article 5'
Пример
Давайте применим метод slice вместе
с методом order_by, чтобы отсортировать
строки по убыванию id и взять только
первые две:
from sqlalchemy import create_engine, select, MetaData, Table, Column, Integer, String
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
)
metadata.create_all(engine)
with engine.begin() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1'},
{'id': 2, 'title': 'article 2'},
{'id': 3, 'title': 'article 3'},
{'id': 4, 'title': 'article 4'},
{'id': 5, 'title': 'article 5'},
])
stmt = select(articles).order_by(articles.c.id.desc()).slice(0, 2)
res = conn.execute(stmt).fetchall()
for row in res:
print(row.title)
Результат выполнения кода:
'article 5'
'article 4'