查询构造器

介绍

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

查询select操作

查询表中所有的数据。

users = db.table('users').get()

for user in users:
print(user['name'])

分片查询表中的数据

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

查询表中的某一条数据

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

查询某一行的某一列数据

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

查询某一列的数据

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

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

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

指定一个selcet语句

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语句在额外查询语句里。

query = db.table('users').select('name')

users = query.add_select('age').get()

使用where操作

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

使用or操作

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

使用where between操作

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

使用where not between操作

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

使用where in操作

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记录

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

使用order by, group by and having操作

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

使用offset and limit操作

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

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

使用Join操作

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

基本join操作

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

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

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

clause = JoinClause('contacts').on('users.id', '=', 'contacts.user_id').or_on(...)

db.table('users').join(clause).get()

还可以加入where等条件

clause = JoinClause('contacts').on('users.id', '=', 'contacts.user_id').where('contacts.user_id', '>', 5)

db.table('users').join(clause).get()

where高级用法

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

参数分组

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

这个查询的sql将是这样。

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

存在查询

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

这个查询的sql将是这样。

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

聚合查询

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

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方法,创建一个原生表达式。

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

插入数据insert

往表中插入数据。

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

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

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

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

更新数据update

更新表中数据。

db.table('users').where('id', 1).update(votes=1)

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

增加或减少某一列的值。

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

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

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

删除数据delete

删除数据。

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

删除所有的数据。

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

清空表数据

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

合并unions

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

first = db.table('users').where_null('first_name')

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

注:使用union_all也可以。

悲观锁

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

db.table('users').where('votes', '>', 100).shared_lock().get()
db.table('users').where('votes', '>', 100).lock_for_update().get()

Python短小精悍的Orator查询构造器的更多相关文章

  1. Python版的数据库查询构造器、ORM及动态迁移数据表。

    Orator Orator提供一个简单和方便的数据库数据处理库. 它的灵感来源于PHP的Laravel框架,借助其思想实现了python版的查询构造器和ORM. 这是完整的文档:http://orat ...

  2. Python短小精悍的Orator基本使用技巧

    基本使用 配置 设置数据库配置参数,创建一个DatabaseManager实例. from orator import DatabaseManager config = { 'mysql': { 'd ...

  3. python操作oracle数据库-查询

    python操作oracle数据库-查询 参照文档 http://www.oracle.com/technetwork/cn/articles/dsl/mastering-oracle-python- ...

  4. Python 代码实现模糊查询

    Python 代码实现模糊查询 1.导语: 模糊匹配可以算是现代编辑器(如 Eclipse 等各种 IDE)的一个必备特性了,它所做的就是根据用户输入的部分内容,猜测用户想要的文件名,并提供一个推荐列 ...

  5. Laravel框架使用查询构造器实现CURD

    一.什么是查询构造器? ①Laravel 查询构造器(query Builder)提供方便,流畅的接口,用来建立及执行数据库查找语法 ②使用PDO参数绑定,以保护应用程序免于SQL注入因此传入的参数不 ...

  6. CI数据库操作_查询构造器类

    =================数据库操作======================1.数据库配置: config/database.php 用户名 密码 数据库 2 加载数据库类:$this-& ...

  7. 【JEECG技术文档】JEECG高级查询构造器使用说明

    功能介绍   高级查询构造器支持主子表联合查询,查询出更精确的数据. 要使用高级查询构造器需要完成以下步骤: 1. 在高级查询管理配置主子表信息. 2. 配置完后在JSP页面DataGrid标签上添加 ...

  8. 基于SQL和PYTHON的数据库数据查询select语句

    #xiaodeng#python3#基于SQL和PYTHON的数据库数据查询语句import pymysql #1.基本用法cur.execute("select * from biao&q ...

  9. Laravel查询构造器简介

    数据表 CREATE TABLE IF NOT EXISTS students( `id` INT AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR(255) NO ...

随机推荐

  1. SiteServer CMS 5.0 源码入门

    开发者中心 STL 语言 文 档 博 客 论 坛 Github 二次开发 提示:文档中心正在完善中,我们将不断发布新文档,敬请期待...   新手入门 SiteServer CMS 能做什么 Site ...

  2. 《thinking in java》 接口与内部类

    书本上的例子 改编后的. package test2; class A{ interface B{void f();} public class BImp implements B{public vo ...

  3. POJ 1639 Picnic Planning:最小度限制生成树

    题目链接:http://poj.org/problem?id=1639 题意: 给你一个无向图,n个节点,m条边,每条边有边权. 让你求一棵最小生成树,同时保证1号节点的度数<=k. 题解: 最 ...

  4. 韩顺平Linux

    shutdown -h now 立刻进行关机 shutdown -r now 立即重启 reboot同上. 用户登录尽量少用root账号登录,因为它是系统管理员,最大的管理权限,避免操作失误. 可以利 ...

  5. DELPHI中四种EXCEL访问技术实现

    一.引言 EXCEL在处理中文报表时功能非常强大,EXCEL报表访问也是信息系统开发中的一个重要内容,本文总结以往开发中所用到的几中EXCEL文件访问方法,在实际工作中也得到了很好的验证,本文列举了其 ...

  6. mysql字符串的隐式转换导致查询异常

    如果mysql某个字段(name)类型为varchar, 加了索引,在执行where查询的时候,传入了int的值,这样就会全表扫描,把每一条的值都转换成int(会出现"中国"-&g ...

  7. leetcode 2 Add Two Numbers(链表)

    数字反过来这个没有什么麻烦,就是镜像的去算十进制加法就可以了,然后就是简单的链表. /** * Definition for singly-linked list. * struct ListNode ...

  8. Fiddler + 海马模拟器转包教程

    Fiddler + 海马模拟器转包教程 转包用来做什么不说了, 整理一下步骤  1.安装Fiddler 下载地址 http://pan.baidu.com/s/18me0A 2.设置Fiddler: ...

  9. SPOJ Query on a tree III (树剖(dfs序)+主席树 || Splay等平衡树)(询问点)

    You are given a node-labeled rooted tree with n nodes. Define the query (x, k): Find the node whose ...

  10. powermock, 强力模拟

    1. powermock是基于mockito或者easymock,TestNG之上的mock: 2. 提供了对于静态函数,私有函数的mock 3. 下载地址:https://github.com/po ...