文章目录
11.2.11 class Negated(node)
class Negated(node)
表示一个否定的类似列的对象。
11.2.12 class Value
classValue(value[, converter=None[, unpack=True]])
参数:
- value – Python 对象或标量值。
converter——用于将值转换为数据库可以理解的类型的函数。
unpack ( bool ) – 是否应将列表或元组解压缩到值列表中或按原样处理。
要在参数化查询中使用的值。调用者有责任确保传入的值可以适应数据库驱动程序理解的类型。
AsIs(value)
表示按Value原样处理并直接传递回数据库驱动程序的 a。如果您正在使用接受本机 Python 数据类型的数据库扩展并且您不希望 Peewee 对这些值进行任何处理,这可能会很有用。
11.2.13 class Cast
class Cast(node, cast)
参数:
- node——一个类似列的对象。
-cast ( str ) – 要转换为的类型。
表示一个表达式。CAST( AS )
11.2.14 class Ordering
class Ordering(node, direction[, collation=None[, nulls=None]])
参数:
- node——一个类似列的对象。
- direction( str ) – ASC 或 DESC
- collation ( str ) – 用于排序的排序规则名称。
- nulls ( str ) – 对空值进行排序(FIRST 或 LAST)。
表示按列状对象排序。
Postgresql 支持非标准子句(“NULLS FIRST/LAST”)。CASEPeewee 将自动对不支持此功能的数据库(Sqlite / MySQL)使用等效语句。
collate([collation=None])
参数: 整理( str ) – 用于排序的排序规则名称。
Asc(node[, collation=None[, nulls=None]])
用于实例化上升Ordering对象的简写。
Desc(node[, collation=None[, nulls=None]])
用于实例化下降Ordering对象的简写。
classExpression(lhs, op, rhs[, flat=True])
参数:
- lhs——左侧。
- op——操作。
- rhs——右手边。
- flat ( bool ) – 是否将表达式括在括号中。
表示形式为 (lhs op rhs) 的二进制表达式,例如 (foo + 1)。
11.2.15 class Entity
class Entity(*path)
参数: 小路– 构成实体名称的虚线路径的组件。
表示查询中引用的实体,例如表、列、别名。该名称可能由多个组件组成,例如“a_table”.“column_name”。
getattr(self, attr)
用于创建子实体的工厂方法。
11.2.16 class SQL
class SQL(sql[, params=None])
参数:
sql ( str ) – SQL 查询字符串。
params ( tuple ) – 查询参数(可选)。
表示参数化的 SQL 查询或查询片段。
Check(constraint[, name=None])
参数:
- constraint( str ) – 约束 SQL。
- name ( str ) – 约束名称。
表示一个 CHECK 约束。
警告
name将约束与列定义一起内联时,MySQL 可能不支持参数。解决方案是将命名Check约束放在模型Meta.constraints
列表中,而不是字段实例constraints=[…]列表中。
11.2.17 class Function
class Function(name, arguments[, coerce=True[, python_value=None]])
参数:
- name ( str ) – 函数名称。
- arguments ( tuple ) – 函数的参数。
- coerce ( bool ) – 从游标读取函数返回值时是否将函数结果强制转换为特定数据类型。
- python_value ( callable ) – 用于转换游标返回值的函数。
表示任意 SQL 函数调用。
笔记
与其直接实例化这个类,不如建议使用fnhelper。
fn用于调用任意 SQL 函数的示例:
# Query users and count of tweets authored.
query = (User
.select(User.username, fn.COUNT(Tweet.id).alias('ct'))
.join(Tweet, JOIN.LEFT_OUTER, on=(User.id == Tweet.user_id))
.group_by(User.username)
.order_by(fn.COUNT(Tweet.id).desc()))
over([partition_by=None[, order_by=None[, start=None[, end=None[, window=None[, exclude=None]]]]]])
参数:
- partition_by ( list ) – 要分区的列列表。
- order_by ( list ) – 排序窗口的列/表达式列表。
- start –SQL表示窗口范围开始的实例或字符串。
- end --SQL表示窗口范围结束的实例或字符串。
- frame_type ( str ) Window.RANGE–Window.ROWS或 Window.GROUPS.
- window( Window ) – 一个Window实例。
- exclude – 帧排除,Window.CURRENT_ROW、 Window.GROUP或Window.TIES之一Window.NO_OTHERS。
笔记
有关在 Peewee 中使用窗口函数的深入指南,请参阅窗口函数部分。
例子:
# Using a simple partition on a single column.
query = (Sample
.select(
Sample.counter,
Sample.value,
fn.AVG(Sample.value).over([Sample.counter]))
.order_by(Sample.counter))
# 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))
# Example using bounded window.
query = (Sample
.select(Sample.value,
fn.SUM(Sample.value).over(
partition_by=[Sample.counter],
start=Window.CURRENT_ROW, # current row
end=Window.following())) # unbounded following
.order_by(Sample.id))
filter(where)
参数: 在哪里– 过滤聚合的表达式。
向聚合函数添加子句。评估 where 表达式以确定将哪些行提供给聚合函数。Postgres 和 SQLite 支持此 SQL 功能。FILTER (WHERE…)
coerce([coerce=True])
参数: 胁迫( bool ) – 是否尝试将函数调用结果强制转换为 Python 数据类型。
当 coerce 为True时,使用几种启发式方法推断目标数据类型。阅读BaseModelCursorWrapper._initialize_columns 方法的源代码以了解其工作原理。
python_value([func=None])
参数: python_value( callable ) – 用于转换游标返回值的函数。
指定转换数据库游标返回的值时要使用的特定函数。例如:
# Get user and a list of their tweet IDs. The tweet IDs are
# returned as a comma-separated string by the db, so we'll split
# the result string and convert the values to python ints.
convert_ids = lambda s: [int(i) for i in (s or '').split(',') if i]
tweet_ids = (fn
.GROUP_CONCAT(Tweet.id)
.python_value(convert_ids))
query = (User
.select(User.username, tweet_ids.alias('tweet_ids'))
.group_by(User.username))
for user in query:
print(user.username, user.tweet_ids)
# e.g.,
# huey [1, 4, 5, 7]
# mickey [2, 3, 6]
# zaizee []
fn()
帮助器fn()实际上是一个实例,Function 它实现了一个__getattr__钩子,为调用 SQL 函数提供了一个很好的 API。
要创建代表 SQL 函数调用的节点,请使用函数名称作为属性fn,然后像调用 Python 函数一样提供参数:
# List users and the number of tweets they have authored,
# from highest-to-lowest:
sql_count = fn.COUNT(Tweet.id)
query = (User
.select(User, sql_count.alias('count'))
.join(Tweet, JOIN.LEFT_OUTER)
.group_by(User)
.order_by(sql_count.desc()))
# Get the timestamp of the most recent tweet:
query = Tweet.select(fn.MAX(Tweet.timestamp))
max_timestamp = query.scalar() # Retrieve scalar result from query.
函数调用可以像其他任何东西一样被组合和嵌套:
# Get users whose username begins with "A" or "a":
a_users = User.select().where(fn.LOWER(fn.SUBSTR(User.username, 1, 1)) == 'a')
11.2.18 class Window
class Window([partition_by=None[, order_by=None[, start=None[, end=None[, frame_type=None[, extends=None[, exclude=None[, alias=None]]]]]]]])
参数:
- partition_by ( list ) – 要分区的列列表。
- order_by ( list ) – 要排序的列列表。
- start –SQL表示窗口范围开始的实例或字符串。
- end --SQL表示窗口范围结束的实例或字符串。
- frame_type ( str ) Window.RANGE–Window.ROWS或 Window.GROUPS.
- extends --Window要扩展的定义。或者,您可以指定窗口的别名。
- exclude – 帧排除,Window.CURRENT_ROW、 Window.GROUP或Window.TIES之一Window.NO_OTHERS。
- alias ( str ) – 窗口的别名。
表示一个WINDOW 子句。
笔记
有关在 Peewee 中使用窗口函数的深入指南,请参阅窗口函数部分。
RANGE
ROWS
GROUPS
指定窗口frame_type。请参阅帧类型:RANGE vs ROWS vs GROUPS。
CURRENT_ROW
引用当前行以在开始/结束子句或框架排除参数中使用。
NO_OTHERS
GROUP
TIES
指定窗框排除参数。
staticpreceding([value=None])
参数: 价值– 前面的行数。如果None是无界的。
生成适合作为 start窗口范围参数传入的 SQL 的便捷方法。
staticfollowing([value=None])
参数: 价值– 后面的行数。如果None是无界的。
生成适合作为 end窗口范围参数传入的 SQL 的便捷方法。
as_rows()
as_range()
as_groups()
指定帧类型。
extends([window=None])
参数: 窗户( Window ) –Window要扩展的定义。或者,您可以指定窗口的别名。
exclude([frame_exclusion=None])
参数: 框架排除– 帧排除,Window.CURRENT_ROW、 Window.GROUP或Window.TIES之一Window.NO_OTHERS。
alias([alias=None])
参数: 别名( str ) – 用于窗口的别名。
Case(predicate, expression_tuples[, default=None]])
参数:
- predicate – CASE 查询的谓词(可选)。
- expression_tuples – 要评估的一个或多个案例。
- default – 默认值(可选)。
回报:
CASE 语句的表示。
例子:
Number = Table('numbers', ('val',))
num_as_str = Case(Number.val, (
(1, 'one'),
(2, 'two'),
(3, 'three')), 'a lot')
query = Number.select(Number.val, num_as_str.alias('num_str'))
# The above is equivalent to:
# SELECT "val",
# CASE "val"
# WHEN 1 THEN 'one'
# WHEN 2 THEN 'two'
# WHEN 3 THEN 'three'
# ELSE 'a lot' END AS "num_str"
# FROM "numbers"
num_as_str = Case(None, (
(Number.val == 1, 'one'),
(Number.val == 2, 'two'),
(Number.val == 3, 'three')), 'a lot')
query = Number.select(Number.val, num_as_str.alias('num_str'))
# The above is equivalent to:
# SELECT "val",
# CASE
# WHEN "val" = 1 THEN 'one'
# WHEN "val" = 2 THEN 'two'
# WHEN "val" = 3 THEN 'three'
# ELSE 'a lot' END AS "num_str"
# FROM "numbers"