Соединения — это функции в модуле 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. Обычно это используется для проверки того, находится ли значение определенного столбца в диапазоне. Например, следующий код выбирает строки, для которых столбец идентификатора находится между 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
и результат выглядит следующим образом —