文章目录
11.2.27 class Query
class Query([where=None[, order_by=None[, limit=None[, offset=None[, **kwargs]]]]])
参数:
- where – WHERE 子句的表示。
- order_by (tuple) – 要排序的列或值。
- limit (int) – LIMIT 子句的值。
- offset (int) – OFFSET 子句的值。
支持方法链 API 的查询的基类。
with_cte(*cte_list)
参数: cte_list – 零个或多个 CTE 对象。
在查询中包含给定的公用表表达式。任何先前指定的 CTE 都将被覆盖。有关公用表表达式的示例,请参阅公用表表达式。
where(*expressions)
参数: 表达式——包含在 WHERE 子句中的零个或多个表达式。
在查询的 WHERE 子句中包含给定的表达式。这些表达式将与任何先前指定的 WHERE 表达式一起进行 AND 运算。
用户名等于“某人”的示例选择用户:
sq = User.select().where(User.username == 'somebody')
选择由编辑或管理员用户发布的推文的示例:
sq = Tweet.select().join(User).where(
(User.is_editor == True) |
(User.is_admin == True))
删除不再活跃用户推文的示例:
inactive_users = User.select().where(User.active == False)
dq = (Tweet
.delete()
.where(Tweet.user.in_(inactive_users)))
dq.execute() # 返回已删除推文的数量。
笔记
where() 调用是可链接的。多个调用将被“AND”在一起。
orwhere(*expressions)
参数: 表达式——包含在 WHERE 子句中的零个或多个表达式。
在查询的 WHERE 子句中包含给定的表达式。此方法与 Query.where() 方法相同,不同之处在于表达式将与任何先前指定的 WHERE 表达式一起进行 OR-ed。
order_by(*values)
参数: values - 零个或多个要排序的列状对象。
定义 ORDER BY 子句。任何先前指定的值都将被覆盖。
order_by_extend(*values)
参数: values - 零个或多个要排序的类似列的对象。
使用给定值扩展任何先前指定的 ORDER BY 子句。
limit([value=None])
参数: value (int) – 为 LIMIT 子句指定值。
offset([value=None])
参数: value (int) – 指定 OFFSET 子句的值。
paginate(page[, paginate_by=20])
参数:
page (int) – 结果的页码(从 1 开始)。
paginate_by (int) – 每页行数。
以更直观的方式指定 LIMIT 和 OFFSET 的便捷方法。
此功能在设计时考虑了网站分页,因此第一页以 page=1 开头。
11.2.28 class SelectBase
class SelectBase
Select和CompoundSelect查询的基类。
peek(database[, n=1])
参数:
database ( Database ) – 执行查询的数据库。
n ( int ) – 要返回的行数。
回报:
如果 n = 1,则为单行,否则为行列表。
执行查询并从游标开始返回给定的行数。该函数可以安全地多次调用,并且总是返回前 N 行结果。
first(database[, n=1])
参数:
数据库( Database ) – 执行查询的数据库。
n ( int ) – 要返回的行数。
回报:
如果 n = 1,则为单行,否则为行列表。
与该peek()方法一样,除了将 aLIMIT应用于查询以确保仅n返回行。多次调用相同的值n不会导致多次执行。
scalar(database[, as_tuple=False])
参数:
数据库( Database ) – 执行查询的数据库。
as_tuple ( bool ) – 将结果作为元组返回?
回报:
单个标量值 if ,否则为行元组。as_tuple = False
从结果的第一行返回一个标量值。如果预期有多个标量值(例如,单个查询中的多个聚合),那么您可以指定as_tuple=True获取行元组。
例子:
query = Note.select(fn.MAX(Note.timestamp))
max_ts = query.scalar(db)
query = Note.select(fn.MAX(Note.timestamp), fn.COUNT(Note.id))
max_ts, n_notes = query.scalar(db, as_tuple=True)
count(database[, clear_limit=False])
参数:
数据库( Database ) – 执行查询的数据库。
clear_limit ( bool ) – 计数时清除任何 LIMIT 子句。
回报:
查询结果集中的行数。
返回查询结果集中的行数。
通过运行 SELECT COUNT(1) FROM () 实现。
exists(database)
参数: 数据库( Database ) – 执行查询的数据库。
回报: 当前查询是否存在任何结果。
返回一个布尔值,指示当前查询是否有任何结果。
get(database)
参数: 数据库( Database ) – 执行查询的数据库。
回报: 来自数据库的单行或None.
执行查询并返回第一行(如果存在)。多次调用将导致执行多个查询。
11.2.29 class CompoundSelectQuery
class CompoundSelectQuery(lhs, op, rhs)
参数:
- lhs ( SelectBase ) – Select 或 CompoundSelect 查询。
- op ( str ) – 操作(例如 UNION、INTERSECT、EXCEPT)。
- rhs ( SelectBase ) – Select 或 CompoundSelect 查询。
表示复合 SELECT 查询的类。
11.2.30 class Select
class Select([from_list=None[, columns=None[, group_by=None[, having=None[, distinct=None[, windows=None[, for_update=None[, for_update_of=None[, for_update_nowait=None[, **kwargs]]]]]]]]]])
参数:
- from_list ( list ) – FROM 子句的来源列表。
- columns ( list ) – 要选择的列或值。
- group_by ( list ) – 要分组的列或值的列表。
- have ( Expression ) – HAVING 子句的表达式。
- distinct – 布尔值或列状对象列表。
- windows ( list ) --Window子句列表。
- for_update – 布尔值或 str 指示是否 SELECT…FOR UPDATE。
- for_update_of – FOR UPDATE OF 子句的一个或多个表。
- for_update_nowait ( bool ) – 指定现在锁定。
表示 SELECT 查询的类。
笔记
而不是直接实例化它,最常见的是您将使用工厂方法,如Table.select()or Model.select()。
选择查询上的方法可以链接在一起。
从数据库中选择一些用户实例的示例。仅选择id 和username列。迭代时,将返回User模型的实例:
query = User.select(User.id, User.username)
for user in query:
print(user.username)
示例选择用户以及用户发布的推文数量。返回的User实例将有一个附加属性“count”,它对应于推文的数量:
query = (User
.select(User, fn.COUNT(Tweet.id).alias('count'))
.join(Tweet, JOIN.LEFT_OUTER)
.group_by(User))
for user in query:
print(user.username, 'has tweeted', user.count, 'times')
笔记
虽然可以Select直接实例化,但更常见的是使用方法链 API 构建查询。
columns(*columns)
参数: 列– 选择零个或多个类似列的对象。
指定要选择的列或类似列的值。
select(*columns)
参数: 列– 选择零个或多个类似列的对象。
与 相同Select.columns(),提供向后兼容性。
select_extend(*columns)
参数: 列– 选择零个或多个类似列的对象。
使用给定的列扩展当前选择。
例子:
def get_users(with_count=False):
query = User.select()
if with_count:
query = (query
.select_extend(fn.COUNT(Tweet.id).alias('count'))
.join(Tweet, JOIN.LEFT_OUTER)
.group_by(User))
return query
from_(*sources)
参数: 来源– FROM 子句的零个或多个来源。
指定应在 FROM 子句中使用哪些类表对象。
User = Table('users')
Tweet = Table('tweets')
query = (User
.select(User.c.username, Tweet.c.content)
.from_(User, Tweet)
.where(User.c.id == Tweet.c.user_id))
for row in query.execute(db):
print(row['username'], '->', row['content'])
join(dest[, join_type=‘INNER’[, on=None]])
参数:
-
dest – 一个表格或类似表格的对象。
-
join_type ( str ) – JOIN 的类型,默认为“INNER”。
-
on ( Expression ) – 连接谓词。
连接类型可以是以下之一: -
JOIN.INNER
-
JOIN.LEFT_OUTER
-
JOIN.RIGHT_OUTER
-
JOIN.FULL
-
JOIN.FULL_OUTER
-
JOIN.CROSS
表达一个 JOIN:
User = Table('users', ('id', 'username'))
Note = Table('notes', ('id', 'user_id', 'content'))
query = (Note
.select(Note.content, User.username)
.join(User, on=(Note.user_id == User.id)))
group_by(*columns)
参数: 价值观– 要分组的零个或多个类似列的对象。
定义 GROUP BY 子句。任何先前指定的值都将被覆盖。
此外,要指定给定表上的所有列,您可以传递表/模型对象来代替各个列。
例子:
query = (User
.select(User, fn.Count(Tweet.id).alias('count'))
.join(Tweet)
.group_by(User))
group_by_extend(*columns)
参数: 价值观– 要分组的零个或多个类似列的对象。
使用给定的列扩展 GROUP BY 子句。
having( *expressions)
参数: 表达式– 包含在 HAVING 子句中的零个或多个表达式。
在查询的 HAVING 子句中包含给定的表达式。这些表达式将与任何先前指定的 HAVING 表达式一起进行 AND 运算。
distinct(*columns)
参数: 列– 零个或多个柱状对象。
指示此查询是否应使用 DISTINCT 子句。通过指定单个值True的查询将使用简单的 SELECT DISTINCT。指定一个或多个列将导致 SELECT DISTINCT ON。
window( *windows)
参数: 视窗– 零个或多个Window对象。
定义 WINDOW 子句。任何先前指定的值都将被覆盖。
例子:
# Equivalent example Using a Window() instance instead.
window = Window(partition_by=[Sample.counter])
query = (Sample
.select(
Sample.counter,
Sample.value,
fn.AVG(Sample.value).over(window))
.window(window) # Note call to ".window()"
.order_by(Sample.counter))
for_update([for_update=True[, of=None[, nowait=None]]])
参数:
- for_update – 布尔值或指示所需表达式的字符串,例如“FOR SHARE”。
- of – 一个或多个要限制锁定的模型。
- nowait ( bool ) – 锁定时指定 NOWAIT 选项。