(1) == 、!=
等于,不等于
db(db.person.dept == 'marketing').select(db.person.ALL)
db(db.person.dept != 'marketing').select(db.person.ALL)
(2) >、>=、<、<= (适用于数值、时间类型的字段)
db(db.person.age>= 'marketing').select(db.person.ALL)
db(db.person.birthday >=date(2000,1,1)).select(db.person.ALL)
针对时间字段的格式的比较,我们用字符串格式的时间即可,pyDAL会帮我们自动转换为date和datetime数据结构,这点非常方便,例如:
db(db.person.birthday >= '2000-1-1').select(db.person.ALL)
db(db.person.birthday >= '2000-01-01').select(db.person.ALL)
datetime字段用一个date对象、date格式的字符串去比较也可以,例如
db(db.person.login_time >=date(2000,1,1)).select(db.person.ALL)
db(db.person.login_time >= '2000-01-01').select(db.person.ALL)
(3)like, startswith, endswith, contains
like要跟通配符%配合使用,熟练掌握like即可,其他三个都可以用like替代(他仨是为不熟悉SQL人员准备)
db(db.person.name.like('John%')).select() 等于 db(db.person.name.startswith('John')).select()
db(db.person.name.like('%John')).select() 等于 db(db.person.name.endswith('John')).select()
db(db.person.name.like('%John%')).select() 等于 db(db.person.name.contains('John')).select()
(4)ilike(大小写脱敏的like)、case_sensitive
大多数数据库中,like都是大小写敏感的,ilike和case_sensitive用于大小写脱敏查询
db(db.person.name.like('John%',case_sensitive=False)).select()等于db(db.person.name.ilike('John%')).select()
(5) belongs
用于单个字段的 多个 或逻辑 组合;
names=['sarah','david','smith']
db(db.person.name.belongs(names)).select() 等价与
db( (db.person.name == 'sarah') |
(db.person.name == 'david') |
(db.person.name == 'smith')
).select()
belongs通常和嵌套查询一起用,我们后面还会讲到
(6) regexp
正则表达运算
db(db.person.id.regexp('^\+?[1-9][0-9]*$')).select()
红色的 正则表达式,意思是必须全是正整数
(7) year, month, day, hour, minutes, seconds
date,datetime格式的字段,快速提取其中 year, month, day, hour, minutes, seconds
db(db.log.event_time.year() > 2018).select() 等价于
db(db.log.event_time > '2018-12-31 23:59:59').select()
(8) len
用于string 或者 text 数据类型的字段。
db(db.person.name.len()>5).select()
(9) count
用于查询结果有多少天记录的技术
db(db.person.name.contains('x')).count()
(10) sum, avg, min, max
对数值型字段求 和、平均、最小、最大
age_sum = db().select(db.person.age.sum()).first()[sum]
age_avg = db().select(db.person.age.avg()).first()[avg]
age_min = db().select(db.person.age.min()).first()[min]
age_max = db().select(db.person.age.max()).first()[max]
可以多个字段一起混合sum, avg, min, max吗?
pyDAL手册中没有例子,也没有j进行说明,经过实践是可以的,只是要获得计算结果,我们要特殊操作下:
record = db().select(db.person.age.min(),db.person.age.avg(),db.person.age.max(),
db.person.salary.sum(),db.person.salary.avg(),).first()
age_min = record ["_extra"]["MIN(`person`.`age`)"]
age_avg = record ["_extra"]["AVG(`person`.`age`)"]
age_max = record ["_extra"]["MAX(`person`.`age`)"]
salary_avg = record ["_extra"]["AVG(`person`.`salary`)"]
salary_sum = record ["_extra"]["SUM(`person`.`salary`)"]