在tornado的database.py基礎上封裝了一個Python的DAL出來,召集幫忙測試的同學

來源:互聯網
上載者:User

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

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.