【引子】python
不少人都知道,Python裏是內置了很好用的sqlite3的。但這個庫有個缺陷,在執行fetchall()/fetchone()等方法後,獲得的是一個tuple。之前吧,作本身的小項目,tuple就tuple,大不了dump成JsonArray,用的時候就values[index],爲了省事,湊合着用。但此次工做須要,咱得返回一個JsonObject,得是字典形式的。sql
土方法:本身用循環解析tuple,手動轉換成dict,但這方法也太傻了點對吧,還很麻煩,你得本身記住table裏的column鍵,與tuple裏的值拼接。對於SELECT * FROM table還好點,對於ide
SELECT column0, column1, ..., FROM table簡直煩死。
一個稍微Py點的寫法是這樣的:函數
values = [{'id' : row[0], 'name' : row[1]} for row in con.fetchall()]
不錯,看起來高大上多了,有python範。但要只是僅此而已的話,me是不屑專門寫篇博文來記錄滴!fetch
【正文】
code
首先呢,咱們知道,python訪問MySql時有個不錯的方法:sqlite
cursor=db.cursor(MySQLdb.cursors.DictCursor)(不知道?那算你看此文的額外收穫)。那麼相似的,sqlite3裏有沒有這樣的實現呢?很遺憾,目前我沒發現,否則也輪不到我這篇博文來討論這個問題了。但,沒有這樣的實現,不表明不能實現!查Api,官方實際上是預留了實現方案的!connect其實有一個屬性,con.row_factory!看到名字估計不少人瞬間就有想法了對吧?沒錯,甚至Api裏都已經寫好了一個實現的函數:
def dict_factory(cursor, row): d = {} for idx, col in enumerate(cursor.description): d[col[0]] = row[idx] return d
只要簡單的把這個函數傳遞給con.row_factory就ok了,之後從這個con取出的值就會經過這個函數,變成key:value形式,key就是建立table時指定的column名字,你不再用另行記錄它們,由於它們本就是存在的,cursor.description本就包含這個信息,只是默認沒有被添加到結果裏罷了!blog
呃,上面那個是官方Api裏面給出的,其實還有更加Pythonic的寫法:ip
def dict_factory(cursor, row): return dict((col[0], row[idx]) for idx, col in enumerate(cursor.description))