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