Функция tuple_
Функция tuple_ создает SQL-выражение,
представляющее кортеж значений. Она принимает
произвольное количество позиционных аргументов
и формирует из них кортеж для использования
в SQL-запросах. Чаще всего применяется вместе
с оператором in_ для сравнения
составных значений, а также для создания
составных первичных ключей и условий
сравнения нескольких колонок одновременно.
Синтаксис
tuple_(*args)
Пример
Давайте создадим кортеж из нескольких значений и выведем его SQL-представление:
from sqlalchemy import tuple_
tup = tuple_(1, 2, 3)
print(tup)
Результат выполнения кода:
"(1, 2, 3)"
Пример
Давайте используем tuple_ вместе
с оператором in_ для сравнения
нескольких колонок сразу. Создадим таблицу
и выполним запрос:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, tuple_, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('status', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'status': 'draft'},
{'id': 2, 'title': 'article 2', 'status': 'published'},
{'id': 3, 'title': 'article 3', 'status': 'archived'},
])
stmt = select(articles).where(
tuple_(articles.c.id, articles.c.status).in_([
(1, 'draft'),
(3, 'archived'),
])
)
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[(1, 'article 1', 'draft'), (3, 'article 3', 'archived')]
Итоговый SQL запрос:
SELECT articles.id, articles.title, articles.status
FROM articles
WHERE (articles.id, articles.status) IN ((1, 'draft'), (3, 'archived'))
Пример
Давайте сравним кортеж колонок с одним конкретным значением через оператор равенства:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, tuple_, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('title', String),
Column('num', Integer),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1', 'num': 10},
{'id': 2, 'title': 'article 2', 'num': 20},
])
stmt = select(articles.c.title).where(
tuple_(articles.c.id, articles.c.num) == (2, 20)
)
res = conn.execute(stmt).fetchall()
print(res)
Результат выполнения кода:
[('article 2',)]
Итоговый SQL запрос:
SELECT articles.title
FROM articles
WHERE (articles.id, articles.num) = (2, 20)