SQLAlchemy 核心 – 使用连接

SQLAlchemy 核心 – 使用连接


连接是 SQLAlchemy 模块中的函数,用于实现 SQL 表达式的 WHERE 子句中使用的关系运算符。运算符 AND、OR、NOT 等用于形成组合两个单独逻辑表达式的复合表达式。在 SELECT 语句中使用 AND 的简单示例如下 –

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

要在学生表的 select() 构造中使用 and_(),请使用以下代码行 –

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 连接的表达式的连接。我们将使用 or_() 将上面示例中的 stmt 对象替换为以下对象

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

进行替换并运行上述代码后,结果将是落在 OR 条件中的两行 –

[(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')

觉得文章有用?

点个广告表达一下你的爱意吧 !😁