Учебники

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

и результат выглядит следующим образом —