Python短小精悍的Orator查询构造器

查询构造器

介绍#

这个数据库查询构造器,提供便利的接口可以创建和执行查询操作,可以在大多数数据库中使用。

查询select操作#

查询表中所有的数据。#

Copy
users = db.table('users').get() for user in users: print(user['name'])

分片查询表中的数据#

Copy
for users in db.table('users').chunk(100): for user in users: # ...

查询表中的某一条数据#

Copy
user = db.table('users').where('name', 'John').first() print(user['name'])

查询某一行的某一列数据#

Copy
user = db.table('users').where('name', 'John').pluck('name')

查询某一列的数据#

Copy
roles = db.table('roles').lists('title')

这个方法返回一个list,如果在加一个参数将返回一个字典。

Copy
roles = db.table('roles').lists('title', 'name')

指定一个selcet语句#

Copy
users = db.table('users').select('name', 'email').get() users = db.table('users').distinct().get() users = db.table('users').select('name as user_name').get()

添加一个select语句在额外查询语句里。#

Copy
query = db.table('users').select('name') users = query.add_select('age').get()

使用where操作#

Copy
users = db.table('users').where('age', '>', 25).get()

使用or操作#

Copy
users = db.table('users').where('age', '>', 25).or_where('name', 'John').get()

使用where between操作#

Copy
users = db.table('users').where_between('age', [25, 35]).get()

使用where not between操作#

Copy
users = db.table('users').where_not_between('age', [25, 35]).get()

使用where in操作#

Copy
users = db.table('users').where_in('id', [1, 2, 3]).get() users = db.table('users').where_not_in('id', [1, 2, 3]).get()

使用where null查询Null记录#

Copy
users = db.table('users').where_null('updated_at').get()

使用order by, group by and having操作#

Copy
query = db.table('users').order_by('name', 'desc') query = query.group_by('count') query = query.having('count', '>', 100) users = query.get()

使用offset and limit操作#

Copy
users = db.table('users').skip(10).take(5).get() users = db.table('users').offset(10).limit(5).get()

使用Join操作#

在查询构造器中也可以使用join连表查询。

基本join操作#

Copy
db.table('users') \ .join('contacts', 'users.id', '=', 'contacts.user_id') \ .join('orders', 'users.id', '=', 'orders.user_id') \ .select('users.id', 'contacts.phone', 'orders.price') \ .get()

左连接操作left join#

Copy
db.table('users').left_join('posts', 'users.id', '=', 'posts.user_id').get()

可以使用更高级的连表用法

Copy
clause = JoinClause('contacts').on('users.id', '=', 'contacts.user_id').or_on(...) db.table('users').join(clause).get()

还可以加入where等条件

Copy
clause = JoinClause('contacts').on('users.id', '=', 'contacts.user_id').where('contacts.user_id', '>', 5) db.table('users').join(clause).get()

where高级用法#

有时候我们需要一些where更高级的用法,这些我们在orator中得以实现。

参数分组#

Copy
db.table('users') \ .where('name', '=', 'John') \ .or_where( db.query().where('votes', '>', 100).where('title', '!=', 'admin') ).get()

这个查询的sql将是这样。

Copy
SELECT * FROM users WHERE name = 'John' OR (votes > 100 AND title != 'Admin')

存在查询#

Copy
db.table('users').where_exists( db.table('orders').select(db.raw(1)).where_raw('order.user_id = users.id') )

这个查询的sql将是这样。

Copy
SELECT * FROM users WHERE EXISTS ( SELECT 1 FROM orders WHERE orders.user_id = users.id )

聚合查询#

这个查询构造器提供了聚合查询。例如:count, max, min, avg, sum

Copy
users = db.table('users').count() price = db.table('orders').max('price') price = db.table('orders').min('price') price = db.table('orders').avg('price') total = db.table('users').sum('votes')

原生表达式#

有时候我们会用到原生表达式,但是要小心sql注入。我们可以使用raw方法,创建一个原生表达式。

Copy
db.table('users') \ .select(db.raw('count(*) as user_count, status')) \ .where('status', '!=', 1) \ .group_by('status') \ .get()

插入数据insert#

往表中插入数据。

Copy
db.table('users').insert(email='foo@bar.com', votes=0) db.table('users').insert({ 'email': 'foo@bar.com', 'votes': 0 })

插入一条记录,并获取自增id。

Copy
db.table('users').insert([ {'email': 'foo@bar.com', 'votes': 0}, {'email': 'bar@baz.com', 'votes': 0} ])

更新数据update#

更新表中数据。

Copy
db.table('users').where('id', 1).update(votes=1) db.table('users').where('id', 1).update({'votes': 1})

增加或减少某一列的值。

Copy
db.table('users').increment('votes') # Increment the value by 1 db.table('users').increment('votes', 5) # Increment the value by 5 db.table('users').decrement('votes') # Decrement the value by 1 db.table('users').decrement('votes', 5) # Decrement the value by 5

指定增加某一行记录的值。

Copy
db.table('users').increment('votes', 1, name='John')

删除数据delete#

删除数据。

Copy
db.table('users').where('age', '<', 25).delete()

删除所有的数据。

Copy
db.table('users').delete()

清空表数据

Copy
db.table('users').truncate()

合并unions#

这个查询构造器提供了合并两个查询的方法。

Copy
first = db.table('users').where_null('first_name') users = db.table('users').where_null('last_name').union(first).get()

注:使用union_all也可以。

悲观锁#

这个查询构造器有一些方法,来帮助在查询中我们实现悲观共享锁。

Copy
db.table('users').where('votes', '>', 100).shared_lock().get()
Copy
db.table('users').where('votes', '>', 100).lock_for_update().get()
posted @   Yxh_blogs  阅读(917)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示
CONTENTS