请求构建器
🧩 查询构建器
🧩 查询构建器
前言
查询构建器是用于构建查询以供以后执行的类。例如,如果您需要查询 where,可以将它们链接这个QueryBuilder
类上。然后修改该类,直到您想要执行查询。模型在后台使用查询构建器进行所有这些调用。许多模型方法实际上都返回QueryBuilder
的实例,因此您可以继续将复杂的查询链接在一起。
直接使用查询构建器类可让您无需使用模型即可进行数据库调用。
获取QueryBuilder类
要获取查询构建器类,只需导入查询构建器即可。导入后,您将需要传递您存储在config.database
文件中的connection_details
字典:
from masonite.orm.builder import QueryBuilder
from config.database import CONNECTIONS
builder = QueryBuilder(connection_details=CONNECTIONS)
然后,您可以开始进行任意数量的数据库调用。
获取记录
Select
builder.table('users').select('username').get()
# SELECT `username` from `users`
首先
您可以轻松获得第一条记录:
builder.table('users').first()
# SELECT `username` from `users`
所有记录
您也可以简单地从表中获取所有记录:
builder.table('users').all()
Get方法
每当需要获取记录时,都可以调用get()
方法,而不是all()
方法。
例如,这是正确的:
builder.table('users').select('username').get()
这是错误的:
builder.table('users').select('username').all()
Wheres
您还可以指定以下任何 where 语句:
最简单的一个是「等于」语句。这是一个查询,用于获取用户名
等于Joe
且age
等于18
的位置:
builder.table('users').where('username', 'Joe').where('age', 18).get()
您还可以指定比较运算符:
builder.table('users').where('age', '=', 18).get()
builder.table('users').where('age', '>', 18).get()
builder.table('users').where('age', '<', 18).get()
builder.table('users').where('age', '>=', 18).get()
builder.table('users').where('age', '<=', 18).get()
Where Null
另一个常见的 where 子句是检查值是否为NULL
的记录:
builder.table('users').where_null('admin').get()
这将获取 admin 列为NULL
的所有记录。
或相反:
builder.table('users').where_not_null('admin').get()
这将查询 admin 为NOT NULL
的所有列。
Where In
为了获取某个列表中的所有记录,我们可以传入一个列表:
builder.table('users').where_in('age', [18,21,25]).get()
这将获取所有年龄为18
,21
,25
的记录。
Limits / Offsets
Limit 或 Offset 查询也非常简单。
Limit 示例:
builder.table('users').limit(10).get()
Offset 示例:
builder.table('users').offset(10).get()
同时使用两者的示例:
builder.table('users').limit(10).offset(10).get()
Between
您可能需要获取所有记录,其中列值介于2个值之间:
builder.table('users').where_between('age', 18, 21).get()
Group By
您可能要按特定的列分组:
builder.table('users').group_by('active').get()
Having
Having 子句通常在 group by 中使用。例如,返回按 salary 分组的所有用户(其中 salary 大于 0):
builder.table('users').sum('salary').group_by('salary').having('salary').get()
也可以指定相同的查询,但其中 salary 总和大于 50,000
builder.table('users').sum('salary').group_by('salary').having('salary', 50000).get()
Inner Joining
内部联接是一种从相关表中获取数据并将其返回到 1 个结果集中的方法,还可以筛选出与联接表无关的任何内容。
builder.table('users').join('table1', 'table2.id', '=', 'table1.table_id')
此联接将创建内部联接。
您还可以选择左联接(Left Join):
Left Join
builder.table('users').left_join('table1', 'table2.id', '=', 'table1.table_id')
和右联接(Right Join):
Right Join
builder.table('users').right_join('table1', 'table2.id', '=', 'table1.table_id')
Increment
有时候,您实际上只需要增加一列,而无需提取任何其他信息。许多增量(Increment)逻辑被隐藏了:
builder.table('users').increment('status')
减量(Decrement)也很相似:
Decrement
builder.table('users').decrement('status')
Aggregates
您可以使用几种聚合(Aggregates)方法来汇总列:
Sum
builder.table('users').sum('salary').get()
Average
builder.table('users').avg('salary').get()
Count
builder.table('users').count('salary').get()
Max
builder.table('users').max('salary').get()
Min
builder.table('users').min('salary').get()
Raw Queries
如果某些查询可以用 raw 形式编写,则可以更轻松地对 select 和 wheres 进行查询:
builder.table('users').select_raw("COUNT(`username`) as username").where_raw("`username` = 'Joe'").get()
获取 SQL
如果要查看执行命令时运行的 SQL。您可以使用to_sql()
。此方法返回查询语句,而不会查询数据。发送到数据库的查询是「qmark 查询」。to_sql()
方法的目的主要用于调试。
有关 qmark 查询的更多信息,请参见下面的部分。
builder.table('users').count('salary').to_sql()
#== SELECT COUNT(`users`.`salary`) FROM `users`
获取 Qmark
Qmark 本质上只是一个普通的 SQL 语句,只是查询被问号代替。应该放在问号位置的值存储在元组中,并与 qmark 查询一起发送,以帮助 SQL 进行注入。 qmark 查询是使用连接类发送的实际查询。
builder.table('users').count('salary').where('age', 18).to_sql()
#== SELECT COUNT(`users`.`salary`) FROM `users` WHERE `users`.`age` = '?'
Updates
更新记录
您可以更新许多记录。
builder.where('active', 0).update({
'active': 1
})
# UPDATE `users` SET `users`.`active` = 1 where `users`.`active` = 0
您也可以更新一条记录。
Deletes
删除记录
您也可以删除许多记录。例如,删除所有 active 设置为 0 的记录。
builder.where('active', 0).delete()
可用方法
开发中
- where
- where_has
- first
- update
- create
- set_scope
- set_global_scope
- select
- select_raw
- create
- delete
- where
- where_raw
- or_where[str, int, callable])
- where_exists"QueryBuilder"]):
- having
- where_null
- where_not_null
- between
- not_between
- where_in
- where_not_in
- join
- left_join
- right_join
- where_column
- limit
- offset
- update
- increment
- decrement
- sum
- count
- max
- order_by
- group_by
- aggregate
- first
- all
- get
- get_grammar
- to_sql
- to_qmark
- new
本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。