在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.age<30)|(t.id<500)

组合出来的条件就是 age>18 and age<30 or id<500


1,查询:

for user in q.select.sort(birth="DESC")():

    print user.name

根据birth字段取倒序,查询出所有的age>18的用户,打印出用户名


查询分页  q.select.sort(birth="DESC")[2:10]() #按页大小20,取第二页的数据


2,更新:

(更新生日大于等于8月23日的用户年龄+1)

t=db.user

q=t(t.birth.DL('%%Y-%%m-%%d','2010-08-23'))

q.update(t.age==t.age+1)


3.删除

在查询的基础上还可以对查询出的结果直接删除掉,比如

q.delete()



API reference


Connection 对象

构造器参数:

host='服务器ip/域名',database='Schame名',user='登录用户',password='密码'

例子:db=Connection(host='127.0.0.1',database='testdb',user='root',password='xxxxx')


方法(名称后带*的是tornado原有database.py中原有的方法,不带*的是扩展的方法):


名称:execute *

参数:(sql,[params])

返回值:执行sql影响的数据行数

用途:执行不返回结果集的sql

例子:db.execute('update testtable set col1=%s where id=%s','haha',1)


名称:executemany *

参数:(sql,[params])

返回值:执行sql影响的数据行数

用途:同时执行多条不返回结果集的sql

例子:db.execute('update testtable set col1=%s where id=%s;update user set age=1 where,id=1','haha',1)


名称:get *

参数:(sql,[params])

返回值:Row对象(见Row对象部分)

用途:返回单行结果

例子:user=db.get('select * from user where id=%s',1)


名称:query *

参数:(sql,[params])

返回值:Row对象列表

用途:返回多行结果

例子:users=db.query('select * from user where id<%s',5)


名称:count

参数:(sql,[params])

返回值:count函数返回的结果

用途:通过sql取记录数

例子:c=db.count('select count(1) from user where age>%s',18)


名称:insert

参数:(tablename,**dict(字段名=值))

用途:插入记录

例子:db.insert('user',name='alex',age=28,)


名称:commit *

参数:无

返回值:无

用途:提交事务,由于不是auto commit的连接,所以对数据库的更新都需要手动commit才能生效

例子:db.commit()


名称:rollback *

参数:无

返回值:无

用途:回滚事务

例子:db.rollback()


名称:fromQuery

参数:Select对象

返回值:TableQueryer对象

用途:得到一个基于已有查询的TableQueryer对象

例子:t2=db.fromQuery(q1)


Row对象

查询的结果集都由Row对象进行封装,Row对象是一个字典,Key是数据库字段名,Value是字段的值,可以通过属性访问字典的Key


TableQueryer对象

通过Connection对象创建

有两种方式:

1: db.tablename    #获取tablename这个表的TableQueryer对象

2: db.fromQuery(q) #通过已经存在的查询获取一个TableQueryer对象,实现子查询

用途:

1:获取字段条件对象  (conds对象)

   例子:t=db.tablename

        t.col1


2:获取查询的执行对象 (Operater对象)

   例子:t=db.tablename

        q=t(t.col1>5)  #需要加入查询条件来创建


方法:

名称: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)[2:10]

则是设定,页大小是10条记录,取地2页


执行sql:

直接执行Select对象

比如:q=db.tablename(db.tablename.col1>5)

     s=q.select.collect(db.tablename.col1,db.tablename.col12)[2:10]

     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

<:生成sql col<%s

>=:生成sql col>=%s

<=:生成sql col<=%s

!=:生成sql col<>%s

&:将两个条件取and关系,比如 (t.col1==5)&(t.col2<20) 生成sql col1=%s and col2<%s

|:将两个条件取or关系


方法:


名称:like

参数:任意对象

返回值:conds对象

用途:生成sql col like %s


名称:In

参数:列表或者Select对象

返回值:conds对象

用途:生成IN 语句


名称:Not_In

参数:列表或者Select对象

返回值:conds对象

用途:生成IN 语句


名称:DL

参数:格式化字符串,时间值

返回值:conds对象

用途:时间字段大于等于给定值

例子:t.col1.DL('%%Y-%%m-%%d','2010-10-20')

SQL: DATE_FORMAT(col1,'%%Y-%%m-%%d')>=%s


名称:DG

参数:格式化字符串,时间值

返回值:conds对象

用途:时间字段小于等于给定值

例子:t.col1.DG('%%Y-%%m-%%d','2010-10-20')

SQL: DATE_FORMAT(col1,'%%Y-%%m-%%d')<=%s


名称:DE

参数:格式化字符串,时间值

返回值:conds对象

用途:时间字段等于给定值

例子:t.col1.DE('%%Y-%%m-%%d','2010-10-20')

SQL: DATE_FORMAT(col1,'%%Y-%%m-%%d')=%s

 

posted on 2010-08-23 17:32  亚历山大同志  阅读(5737)  评论(8编辑  收藏  举报

导航