Функция collate
Функция collate применяет правило сортировки (collation)
к выражению столбца. Первым параметром функция принимает
выражение столбца, вторым - имя правила сортировки.
Правило сортировки определяет, как база данных сравнивает
и упорядочивает строковые значения.
Функция возвращает новое выражение столбца с примененным
правилом сортировки. Это выражение можно использовать
в конструкциях select, order_by
и where.
Синтаксис
collate(column, collation)
Пример
Давайте создадим таблицу статей и применим правило
сортировки NOCASE к столбцу title:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, collate
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article', 'text': 'text 1'},
{'id': 2, 'title': 'Article', 'text': 'text 2'},
{'id': 3, 'title': 'ARTICLE', 'text': 'text 3'},
])
stmt = select(articles.c.title).order_by(collate(articles.c.title, 'NOCASE'))
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[('article',), ('Article',), ('ARTICLE',)]
Пример
Давайте посмотрим, какой SQL-запрос формируется
при использовании функции collate:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, collate
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
)
stmt = select(articles.c.title).order_by(collate(articles.c.title, 'NOCASE'))
print(stmt)
Итоговый SQL запрос:
SELECT articles.title
FROM articles
ORDER BY articles.title COLLATE "NOCASE"
Пример
Давайте применим правило сортировки в условии where
для регистронезависимого поиска:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select, collate
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('text', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article', 'text': 'text 1'},
{'id': 2, 'title': 'Article', 'text': 'text 2'},
{'id': 3, 'title': 'ARTICLE', 'text': 'text 3'},
])
stmt = select(articles.c.id, articles.c.title).where(
collate(articles.c.title, 'NOCASE') == 'article'
)
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[(1, 'article'), (2, 'Article'), (3, 'ARTICLE')]