Метод in_ класса ColumnElement
Метод in_ класса ColumnElement создает
выражение для проверки вхождения значения столбца
в заданный список значений или в подзапрос.
Метод принимает один параметр - последовательность
значений или объект подзапроса. Результатом
является бинарное выражение, которое можно
использовать в конструкции where.
Синтаксис
ColumnElement.in_(other)
Пример
Давайте создадим таблицу и проверим вхождение значения столбца в список:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
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.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'title': 'article 1'},
{'id': 2, 'title': 'article 2'},
{'id': 3, 'title': 'article 3'},
])
query = select(articles.c.title).where(articles.c.id.in_([1, 3]))
res = conn.execute(query).fetchall()
print(res)
Результат выполнения кода:
[('article 1',), ('article 3',)]
Пример
Давайте используем метод in_ с подзапросом:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('status', String),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'status': 'published'},
{'id': 2, 'status': 'draft'},
{'id': 3, 'status': 'published'},
])
subquery = select(articles.c.id).where(articles.c.status == 'published')
query = select(articles.c.id).where(articles.c.id.in_(subquery))
res = conn.execute(query).fetchall()
print(res)
Результат выполнения кода:
[(1,), (3,)]
Пример
Давайте применим метод in_ совместно с
отрицанием через notin_ для сравнения:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, select
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
articles = Table(
'articles', metadata,
Column('id', Integer, primary_key=True),
Column('num', Integer),
)
metadata.create_all(engine)
with engine.connect() as conn:
conn.execute(articles.insert(), [
{'id': 1, 'num': 10},
{'id': 2, 'num': 20},
{'id': 3, 'num': 30},
])
query_in = select(articles.c.id).where(articles.c.num.in_([10, 30]))
res_in = conn.execute(query_in).fetchall()
print(res_in)
query_notin = select(articles.c.id).where(articles.c.num.notin_([10, 30]))
res_notin = conn.execute(query_notin).fetchall()
print(res_notin)
Результат выполнения кода:
[(1,), (3,)]
[(2,)]
Смотрите также
-
класс
ColumnElement,
который представляет базовый класс для элементов столбцов -
метод
notin_,
который выполняет проверку на отсутствие вхождения -
метод
between,
который проверяет вхождение значения в диапазон -
метод
is_,
который выполняет сравнение с NULL или логическим значением