SQLAlchemy Core - Использование союзов
Конъюнкции - это функции в модуле SQLAlchemy, которые реализуют операторы отношения, используемые в предложении WHERE выражений SQL. Операторы AND, OR, NOT и т. Д. Используются для формирования составного выражения, объединяющего два отдельных логических выражения. Простой пример использования AND в операторе SELECT выглядит следующим образом:
SELECT * from EMPLOYEE WHERE salary>10000 AND age>30
Функции SQLAlchemy and_ (), or_ () и not_ () соответственно реализуют операторы AND, OR и NOT.
and_ () функция
Он создает соединение выражений, соединенных оператором AND. Пример приведен ниже для лучшего понимания -
from sqlalchemy import and_
print(
and_(
students.c.name == 'Ravi',
students.c.id <3
)
)
Это означает -
students.name = :name_1 AND students.id < :id_1
Чтобы использовать and_ () в конструкции select () в таблице студентов, используйте следующую строку кода -
stmt = select([students]).where(and_(students.c.name == 'Ravi', students.c.id <3))
Будет построен оператор SELECT следующего характера -
SELECT students.id,
students.name,
students.lastname
FROM students
WHERE students.name = :name_1 AND students.id < :id_1
Полный код, отображающий вывод вышеуказанного запроса SELECT, выглядит следующим образом:
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, ForeignKey, select
engine = create_engine('sqlite:///college.db', echo = True)
meta = MetaData()
conn = engine.connect()
students = Table(
'students', meta,
Column('id', Integer, primary_key = True),
Column('name', String),
Column('lastname', String),
)
from sqlalchemy import and_, or_
stmt = select([students]).where(and_(students.c.name == 'Ravi', students.c.id <3))
result = conn.execute(stmt)
print (result.fetchall())
Следующая строка будет выбрана при условии, что таблица студентов заполнена данными, используемыми в предыдущем примере -
[(1, 'Ravi', 'Kapoor')]
or_ () функция
Он производит соединение выражений, соединенных оператором OR. Мы заменим объект stmt в приведенном выше примере на следующий, используя or_ ()
stmt = select([students]).where(or_(students.c.name == 'Ravi', students.c.id <3))
Что будет эффективно эквивалентно следующему запросу SELECT -
SELECT students.id,
students.name,
students.lastname
FROM students
WHERE students.name = :name_1
OR students.id < :id_1
После того, как вы сделаете замену и запустите приведенный выше код, результатом будут две строки, попадающие в условие ИЛИ -
[(1, 'Ravi', 'Kapoor'),
(2, 'Rajiv', 'Khanna')]
функция asc ()
Он создает предложение ORDER BY по возрастанию. Функция принимает столбец для применения функции в качестве параметра.
from sqlalchemy import asc
stmt = select([students]).order_by(asc(students.c.name))
Оператор реализует следующее выражение SQL -
SELECT students.id,
students.name,
students.lastname
FROM students
ORDER BY students.name ASC
В следующем коде перечислены все записи в таблице студентов в порядке возрастания столбца имени -
from sqlalchemy import create_engine, MetaData, Table, Column, Integer, String, ForeignKey, select
engine = create_engine('sqlite:///college.db', echo = True)
meta = MetaData()
conn = engine.connect()
students = Table(
'students', meta,
Column('id', Integer, primary_key = True),
Column('name', String),
Column('lastname', String),
)
from sqlalchemy import asc
stmt = select([students]).order_by(asc(students.c.name))
result = conn.execute(stmt)
for row in result:
print (row)
Приведенный выше код дает следующий вывод -
(4, 'Abdul', 'Sattar')
(3, 'Komal', 'Bhandari')
(5, 'Priya', 'Rajhans')
(2, 'Rajiv', 'Khanna')
(1, 'Ravi', 'Kapoor')
функция desc ()
Аналогичным образом функция desc () создает предложение ORDER BY по убыванию следующим образом:
from sqlalchemy import desc
stmt = select([students]).order_by(desc(students.c.lastname))
Эквивалентное выражение SQL -
SELECT students.id,
students.name,
students.lastname
FROM students
ORDER BY students.lastname DESC
И вывод для приведенных выше строк кода -
(4, 'Abdul', 'Sattar')
(5, 'Priya', 'Rajhans')
(2, 'Rajiv', 'Khanna')
(1, 'Ravi', 'Kapoor')
(3, 'Komal', 'Bhandari')
между () функция
Он создает предложение предиката BETWEEN. Обычно это используется для проверки того, попадает ли значение определенного столбца в диапазон. Например, следующий код выбирает строки, для которых столбец id находится между 2 и 4 -
from sqlalchemy import between
stmt = select([students]).where(between(students.c.id,2,4))
print (stmt)
Результирующее выражение SQL похоже -
SELECT students.id,
students.name,
students.lastname
FROM students
WHERE students.id
BETWEEN :id_1 AND :id_2
и результат следующий -
(2, 'Rajiv', 'Khanna')
(3, 'Komal', 'Bhandari')
(4, 'Abdul', 'Sattar')