在tornado的database.py基础上封装了一个Python的DAL出来,召集帮忙测试的同学
tornado内部化包含了一个很简陋的database.py,最近在这个简单封装了MysqlDb的模块基础上增加增强的功能。对于Python这种动态语言来说我觉得ORM有点过度封装了,很多时候简单的数据操作不好用,太复杂的操作又不如直接写Sql,所以我放弃了Orm的方式,而是直接抽象了Sql的构建,现在的版本支持单表的sql查询,支持子查询,当然还有一些操作有所遗漏,我会继续向项目里追加。
下载地址:/Files/Alexander-Lee/database.py.zip
文档:
Quick start
假设建立表User
create table `user`(
`id` bigint(20) AUTO_INCREMENT,
`name` varchar(20),
`age` int(10),
`birth` datetime,
)
创建连接:
db=Connection(host='127.0.0.1',database='testdb',user='root',password='xxxxx')
基本sql操作
--------------------------------------------------------------------------
查询多行
(打印年龄大于18的用户名)
for row in db.query('select * from user where age>%s',18)
print row.name
查询单行
(获取id=5的用户)
user=db.query('select * from user where id=%s',5)
执行sql
(更新生日大于等于8月23日的用户年龄+1)
db.query('update user set age=age+1 where DATE_FORMAT(birth,'%%Y-%%m-%%d')>=%s','2010-08-23')
插入记录
db.insert('user',name='alex',age=28,birth='1981-08-31')
--------------------------------------------------------------------------
无sql操作
step 1 获取表对象
t = db.user
step 2 创建一个查询
q=t(t.age>18) #用户年龄大于18岁的查询
在这个查询的基础上可以进行下一步的操作,在这个筛选数据条件基础上对筛选出来的数据进行查询、更新、删除的操作
查询条件可以多个组合,比如
(t.age>18)&(t.age5)#需要加入查询条件来创建
方法:
名称:get_one
参数:conds对象
返回值:Row对象
用途:获取表中单条记录
例子:user=db.user.get_one(db.user.id==5)
名称:insert
参数:**dict(字段名=值)
返回值:是否成功
用途:插入记录到该表
例子:db.tablename.insert(col1=123,col2='abc')
Operater对象
通过调用TableQueryer对象创建
属性:
select:返回Select对象
update:返回Update对象
delete:返回Delete对象
insert:返回Insert对象
Select对象
生成select的sql,收集参数,并执行返回多行结果集
方法:
名称:group_by
参数:*conds对象
返回值:Select对象
用途:加入group by操作的设定
例子:q=db.tablename(db.tablename.col1>5)
q.select.group_by(db.tablename.age)
sql:select * from tablename where col1>5 group by age
名称:having
参数:conds对象
返回值:Select对象
用途:加入having设定
例子:q=db.tablename(db.tablename.col1>5)
q.select.group_by(db.tablename.age).having(db.tablename.col2.count>6)
sql:select * from tablename where col1>5 group by age having count(col2)>6
备注:必须在调用了group_by的前提下才能调用having,否则having条件不生效
名称:collect
参数:*conds
返回值:Select对象
用途:设定要筛选出的字段
例子:q=db.tablename(db.tablename.col1>5)
q.select.collect(db.tablename.col1,db.tablename.col12)
sql:select col1,col2 from tablename where col1>5
名称:limit
参数:start,count
返回值:Select对象
用途:设定limit参数
例子:q=db.tablename(db.tablename.col1>5)
q.select.collect(db.tablename.col1,db.tablename.col12).limit(10,10)
sql:select col1,col2 from tablename where col1>5 limit 10,10
名称:get_sql
参数:无
返回值:生成的sql语句
用途:返回生成的sql语句
分页:
对Select对象切片操作即可设定分页参数
比如:q=db.tablename(db.tablename.col1>5)
q.select.collect(db.tablename.col1,db.tablename.col12)
则是设定,页大小是10条记录,取地2页
执行sql:
直接执行Select对象
比如:q=db.tablename(db.tablename.col1>5)
s=q.select.collect(db.tablename.col1,db.tablename.col12)
rs=s()
Update对象:
用于生成Update语句更新记录
例子:
q=db.tablename(db.tablename.col1>5)
q.update(db.tablename.col3==db.tablename.col3+5)
sql:update tablename set col3=col3+5 where col1>5
Delete对象
用于生成Delete语句
例子:
q=db.tablename(db.tablename.col1>5)
q.delete()
sql:delete from tablename where col1>5
Insert对象
用于生成insert语句
例子:
q=db.tablename(db.tablename.col1>5)
q.insert(col1=1,col2='abc')
conds对象
字段定义以及字段关系条件的定义对象
通过TableQueryer对象的属性获取新的对象
比如: t=db.tablename
t.col1
操作符:
==:赋值或者相等比较,比如 t.col1==5 生成sql col=%s 且在参数列表中加入值5
>:生成sql col>%s
=%s
页:
[1]