SQLAlchemy Core - Usando Conjunções
Conjunções são funções no módulo SQLAlchemy que implementam operadores relacionais usados na cláusula WHERE de expressões SQL. Os operadores AND, OR, NOT, etc., são usados para formar uma expressão composta combinando duas expressões lógicas individuais. Um exemplo simples de uso de AND na instrução SELECT é o seguinte -
SELECT * from EMPLOYEE WHERE salary>10000 AND age>30
As funções SQLAlchemy and_ (), or_ () e not_ (), respectivamente, implementam os operadores AND, OR e NOT.
and_ () function
Ele produz uma conjunção de expressões unidas por AND. Um exemplo é dado abaixo para melhor compreensão -
from sqlalchemy import and_
print(
and_(
students.c.name == 'Ravi',
students.c.id <3
)
)
Isso se traduz em -
students.name = :name_1 AND students.id < :id_1
Para usar and_ () em uma construção select () em uma tabela de alunos, use a seguinte linha de código -
stmt = select([students]).where(and_(students.c.name == 'Ravi', students.c.id <3))
A instrução SELECT da seguinte natureza será construída -
SELECT students.id,
students.name,
students.lastname
FROM students
WHERE students.name = :name_1 AND students.id < :id_1
O código completo que exibe a saída da consulta SELECT acima é o seguinte -
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())
A linha a seguir será selecionada assumindo que a tabela de alunos é preenchida com dados usados no exemplo anterior -
[(1, 'Ravi', 'Kapoor')]
função or_ ()
Ele produz conjunção de expressões unidas por OR. Devemos substituir o objeto stmt no exemplo acima pelo seguinte usando or_ ()
stmt = select([students]).where(or_(students.c.name == 'Ravi', students.c.id <3))
O que será efetivamente equivalente a seguir a consulta SELECT -
SELECT students.id,
students.name,
students.lastname
FROM students
WHERE students.name = :name_1
OR students.id < :id_1
Depois de fazer a substituição e executar o código acima, o resultado será duas linhas caindo na condição OU -
[(1, 'Ravi', 'Kapoor'),
(2, 'Rajiv', 'Khanna')]
função asc ()
Ele produz uma cláusula ORDER BY crescente. A função usa a coluna para aplicar a função como parâmetro.
from sqlalchemy import asc
stmt = select([students]).order_by(asc(students.c.name))
A declaração implementa a seguinte expressão SQL -
SELECT students.id,
students.name,
students.lastname
FROM students
ORDER BY students.name ASC
O código a seguir lista todos os registros na tabela de alunos em ordem crescente da coluna de nome -
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)
O código acima produz a seguinte saída -
(4, 'Abdul', 'Sattar')
(3, 'Komal', 'Bhandari')
(5, 'Priya', 'Rajhans')
(2, 'Rajiv', 'Khanna')
(1, 'Ravi', 'Kapoor')
função desc ()
Da mesma forma, a função desc () produz a cláusula ORDER BY decrescente da seguinte forma -
from sqlalchemy import desc
stmt = select([students]).order_by(desc(students.c.lastname))
A expressão SQL equivalente é -
SELECT students.id,
students.name,
students.lastname
FROM students
ORDER BY students.lastname DESC
E a saída para as linhas de código acima é -
(4, 'Abdul', 'Sattar')
(5, 'Priya', 'Rajhans')
(2, 'Rajiv', 'Khanna')
(1, 'Ravi', 'Kapoor')
(3, 'Komal', 'Bhandari')
entre () função
Ele produz uma cláusula de predicado BETWEEN. Isso geralmente é usado para validar se o valor de uma determinada coluna está entre um intervalo. Por exemplo, o código a seguir seleciona linhas para as quais a coluna id está entre 2 e 4 -
from sqlalchemy import between
stmt = select([students]).where(between(students.c.id,2,4))
print (stmt)
A expressão SQL resultante é semelhante a -
SELECT students.id,
students.name,
students.lastname
FROM students
WHERE students.id
BETWEEN :id_1 AND :id_2
e o resultado é o seguinte -
(2, 'Rajiv', 'Khanna')
(3, 'Komal', 'Bhandari')
(4, 'Abdul', 'Sattar')