- SQLAlchemy 教程
- SQLAlchemy - 主页
- SQLAlchemy - 简介
- SQLAlchemy 核心
- 表达语言
- 连接到数据库
- 创建表
- SQL 表达式
- 执行表达式
- 选择行
- 使用文本 SQL
- 使用别名
- 使用 UPDATE 表达式
- 使用 DELETE 表达式
- 使用多个表
- 使用多个表更新
- 按参数顺序更新
- 多表删除
- 使用连接
- 使用连词
- 使用函数
- 使用集合运算
- SQLAlchemy ORM
- 声明映射
- 创建会话
- 添加对象
- 使用查询
- 更新对象
- 应用过滤器
- 过滤器运算符
- 返回列表和标量
- 文本SQL
- 建立关系
- 使用相关对象
- 使用连接
- 常见关系运算符
- 急切加载
- 删除相关对象
- 多对多关系
- 方言
- SQLAlchemy 有用资源
- SQLAlchemy - 快速指南
- SQLAlchemy - 有用的资源
- 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')