SQLAlchemy Core – Using Conjunctions
Conjunctions are functions in SQLAlchemy module that implement relational operators used in WHERE clause of SQL expressions. The operators AND, OR, NOT, etc., are used to form a compound expression combining two individual logical expressions. A simple example of using AND in SELECT statement is as follows −
SELECT * from EMPLOYEE WHERE salary>10000 AND age>30
SQLAlchemy functions and_(), or_() and not_() respectively implement AND, OR and NOT operators.
and_() function
It produces a conjunction of expressions joined by AND. An example is given below for better understanding −
from sqlalchemy import and_ print( and_( students.c.name == ''Ravi'', students.c.id <3 ) )
This translates to −
students.name = :name_1 AND students.id < :id_1
To use and_() in a select() construct on a students table, use the following line of code −
stmt = select([students]).where(and_(students.c.name == ''Ravi'', students.c.id <3))
SELECT statement of the following nature will be constructed −
SELECT students.id, students.name, students.lastname FROM students WHERE students.name = :name_1 AND students.id < :id_1
The complete code that displays output of the above SELECT query is as follows −
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())
Following row will be selected assuming that students table is populated with data used in previous example −
[(1, ''Ravi'', ''Kapoor'')]
or_() function
It produces conjunction of expressions joined by OR. We shall replace the stmt object in the above example with the following one using or_()
stmt = select([students]).where(or_(students.c.name == ''Ravi'', students.c.id <3))
Which will be effectively equivalent to following SELECT query −
SELECT students.id, students.name, students.lastname FROM students WHERE students.name = :name_1 OR students.id < :id_1
Once you make the substitution and run the above code, the result will be two rows falling in the OR condition −
[(1, ''Ravi'', ''Kapoor''), (2, ''Rajiv'', ''Khanna'')]
asc() function
It produces an ascending ORDER BY clause. The function takes the column to apply the function as a parameter.
from sqlalchemy import asc stmt = select([students]).order_by(asc(students.c.name))
The statement implements following SQL expression −
SELECT students.id, students.name, students.lastname FROM students ORDER BY students.name ASC
Following code lists out all records in students table in ascending order of name column −
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)
Above code produces following output −
(4, ''Abdul'', ''Sattar'') (3, ''Komal'', ''Bhandari'') (5, ''Priya'', ''Rajhans'') (2, ''Rajiv'', ''Khanna'') (1, ''Ravi'', ''Kapoor'')
desc() function
Similarly desc() function produces descending ORDER BY clause as follows −
from sqlalchemy import desc stmt = select([students]).order_by(desc(students.c.lastname))
The equivalent SQL expression is −
SELECT students.id, students.name, students.lastname FROM students ORDER BY students.lastname DESC
And the output for the above lines of code is −
(4, ''Abdul'', ''Sattar'') (5, ''Priya'', ''Rajhans'') (2, ''Rajiv'', ''Khanna'') (1, ''Ravi'', ''Kapoor'') (3, ''Komal'', ''Bhandari'')
between() function
It produces a BETWEEN predicate clause. This is generally used to validate if value of a certain column falls between a range. For example, following code selects rows for which id column is between 2 and 4 −
from sqlalchemy import between stmt = select([students]).where(between(students.c.id,2,4)) print (stmt)
The resulting SQL expression resembles −
SELECT students.id, students.name, students.lastname FROM students WHERE students.id BETWEEN :id_1 AND :id_2
and the result is as follows −
(2, ''Rajiv'', ''Khanna'') (3, ''Komal'', ''Bhandari'') (4, ''Abdul'', ''Sattar'')