Giter Site home page Giter Site logo

python_mysql's Introduction

tornado内部化包含了一个很简陋的database.py,最近在这个简单封装了MysqlDb的模块基础上增加增强的功能。
对于Python这种动态语言来说我觉得ORM有点过度封装了,很多时候简单的数据操作不好用,太复杂的操作又不如直接写Sql,所以我放弃了Orm的方式,而是直接抽象了Sql的构建,现在的版本支持单表的sql查询,支持子查询,当然还有一些操作有所遗漏,我会继续向项目里追加。
下载地址:http://files.cnblogs.com/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

python_mysql's People

Contributors

fkook avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

python_mysql's Issues

tableQuery 无法正常运行

非常感谢你能提供这么棒的代码,但是我在阅读的时候发现了这样两个问题:

  1. 257 行,逗号是不是写错了
    _sql="",join(["SELECT count(1) FROM ",self.tablename])
  2. 556 行,array 是哪里来的,而且是 self.sel 的调用
    大哥,我觉的你是为了处理 table.select 还有 table.id 这样的东西来进行操作的,
    但是小弟真是看不懂代码,求指导。。。
    我运行的时候报错,简单的count 貌似都通不过的样子

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.