1. 概述
1.1 前言
最近用Caffe跑自己的資料集,需要學習LMDB和LevelDB,趁此機會複習了SQLite和MySQL的使用,一起整理在此。
程式碼:https://github.com/liquidconv/py4db
1.2 環境
使用Ubuntu 14.04,Python 2.7.6。
2. SQLite
2.1 準備
SQLite是一種嵌入式資料庫,它的資料庫就是一個檔案。Python 2.5x以上版本內建了SQLite3,使用時直接import sqlite3即可。
2.2 操作流程
概括地講,操作SQLite的流程是:
-
透過sqlite3.open()建立與資料庫檔案的連線物件connection;
-
透過connection.cursor()建立游標物件cursor;
-
透過cursor.execute()執行SQL陳述句;
-
透過connection.commit()提交當前的事務,或者透過cursor.fetchall()獲得查詢結果;
-
透過connection.close()關閉與資料庫檔案的連線。
詳細的sqlite3模組API可以看這裡:
http://www.runoob.com/sqlite/sqlite-python.html
總結起來就是用cursor.execute()執行SQL陳述句,改變資料(插入、刪除、修改)時用connection.commit()提交變更,查詢資料時用cursor.fetchall()得到查詢結果。
2.3 操作實體
2.3.1 建立資料庫與建立表
直接來看例子:
這裡conn是與資料庫檔案test.db的連線物件,c是conn的游標物件,透過c.execute()執行建表操作,建立了簡單的學生資訊表(學號,名字),透過conn.commit()提交,最後用conn.close()關閉連線。
conn.open()發現檔案不存在時會自動建立,這裡使用了檔案“test.db”,也可以使用“:memory:”建立記憶體資料庫。
2.3.2 插入、刪除、修改
為了便於多次執行,直接使用了記憶體資料庫:
做的事情還是非常簡單易懂的,向學生資訊表中插入(1,Alice)、(2,Bob)、(3,Peter)三條記錄,刪除(1,Alice),修改(3,Peter)為(3,Mark)。
“?”是sqlite3中的佔位符,execute時會用第二個引數元組裡的元素按順序替換。官方檔案裡建議出於安全考慮,不要直接用python做字串拼接。
另外註意不需要每次execute後呼叫commit。
2.3.3 查詢
直接在上面的程式碼commit之後加上:
執行一下,輸出結果為:
test_query.py
fetchall()傳回的是記錄陣列,可以透過WHERE子句做更細緻的選擇。
2.3.4 完整的例子
把上面的操作寫成函式形式:
執行一下,輸出結果為:
test_sqlite.py
之後用的例子都是這個簡單的學生資訊表(學號,姓名)。
3. MySQL
3.1 準備
安裝MySQL:
安裝MySQLdb:
使用時import MySQLdb(註意大小寫)。
3.2 操作流程
同為關係型資料庫,MySQL的操作方法和SQLite是大同小異的。建立連線物件與游標物件,用execute()執行SQL陳述句,commi()提交事物,fetchall()獲得查詢結果。
3.3 操作實體
直接看MySQL版本的完整例子:
對比後可以發現區別僅是建立連線時引數複雜一些,同時需要用select_db()選擇資料庫。
執行一下,輸出結果為:
test_mysql.py
4. LMDB
4.1 準備
學習LMDB的時候不禁想到知乎上的提問“有哪些名人長期生活在其他名人的光環下”,說實話感覺查它的人基本都是為了用Caffe……
Anyway,LMDB和SQLite/MySQL等關係型資料庫不同,屬於key-value資料庫(把LMDB想成dict會比較容易理解),鍵key與值value都是字串。
安裝:
使用時import lmdb。
4.2 操作流程
概況地講,操作LMDB的流程是:
-
透過env = lmdb.open()開啟環境
-
透過txn = env.begin()建立事務
-
透過txn.put(key, value)進行插入和修改
-
透過txn.delete(key)進行刪除
-
透過txn.get(key)進行查詢
-
透過txn.cursor()進行遍歷
-
透過txn.commit()提交更改
4.3 操作實體
4.3.1 建立環境
執行一下,檢視當前目錄的變化:
set_env.py
可以看到當前目錄下多了students目錄,裡面有data.mdb和lock.mdb兩個檔案。
4.3.2 插入、刪除、修改
插入與修改都用put實現,刪除用delete實現。
註意用txn = env.begin()建立事務時,有write = True才能夠寫資料庫。
4.3.3 查詢
查單條記錄用get(key),遍歷資料庫用cursor。
直接在上面的程式碼commit()之後加上:
執行一下,輸出結果為:
test_query.py
註意上次commit()之後要用env.begin()更新txn。
4.3.4 完整的例子
執行一下,輸出結果為:
test_lmdb.py
5. LevelDB
5.1 準備
同為key-value資料庫,LevelDB的資料比LMDB豐富太多了。值得一提的是LevelDB實現時用到了SkipList,以後有機會要親自實現一下。
安裝:
使用時import leveldb。
5.2 操作流程
LevelDB操作時類似與LMDB,使用Put/Get/Delete,但是更加簡單(不需要事務txn和commit提交),同時支援範圍迭代器RangeIter。
5.3 操作實體
來看LevelDB版本的完整例子:
執行一下,輸出結果為:
test_leveldb.py
此外,由於沒有commit()操作,leveldb中用WriteBatch實現多條更改一次提交,直接copy示例程式碼如下:
6. 學習總結
這次學習四種資料庫操作時,是按照SQLite -> MySQL -> LMDB -> LevelDB的順序,所以研究SQLite與LMDB花了較長時間,而MySQL與LevelDB很快就搞定了。某種意義上,學習技術和背單詞一樣,當前掌握的單詞越多,背新單詞就越容易——因為可以把新單詞和已經掌握的同義詞聯絡在一起,在腦海裡聚成簇。
最後回顧一下,SQLite與MySQL都是關係型資料庫,操作時建立連線物件connection與游標物件cursor,透過execute執行SQL陳述句,commit提交變更,fetch得到查詢結果;LMDB與LevelDB都是K-V資料庫,操作時建立與資料庫的連線,用put/delete改變資料,用get獲取資料,區別是LMDB中有事務需要commit,LevelDB不需要。
7. 參考資料
-
SQLite
SQLite教程:
http://www.runoob.com/sqlite/sqlite-python.html
SQLite全面學習:
Python檔案關於sqlite3的介紹:
https://docs.python.org/2/library/sqlite3.html
-
MySQL
MySQLdb模組:
http://www.oschina.net/code/snippet_16840_1811
Python操作MySQL:
http://www.cnblogs.com/rollenholt/archive/2012/05/29/2524327.html
-
LMDB
Creating an LMDB database in Python:
http://deepdish.io/2015/04/28/creating-lmdb-in-python/
Python lmdb:
http://blog.csdn.net/ayst123/article/details/44077903
lmdb 0.87 documentation:
http://lmdb.readthedocs.org/en/latest/
-
LevelDB
py-leveldb示例程式碼:
http://www.oschina.net/p/py-leveldb?fromerr=G5QJs7l1
Having a look at LevelDB:
作者:kophy
連結:
http://www.jianshu.com/p/66496c8726a1
本文來自“Python頭條”微信公眾號
ID:Pythontoutiao
▲▲▲掃碼立刻關註▲▲▲
最具關註價值的中文Python技術公眾賬號。
(12月內關註賬號可領取10集Python入門影片)
————廣告時間————
馬哥教育2018年Python自動化運維開發實戰面授班2018年3月5號開班,馬哥聯合BAT、豆瓣等一線網際網路Python開發達人,根據目前企業需求的Python開發人才進行了深度定製,加入了大量一線網際網路公司:大眾點評、餓了麼、騰訊等生產環境真是專案,課程由淺入深,從Python基礎到Python高階,讓你融匯貫通Python基礎理論,手把手教學讓你具備Python自動化開發需要的前端介面開發、Web框架、大監控系統、CMDB系統、認證堡壘機、自動化流程平臺六大實戰能力,讓你從0開始蛻變成Hold住年薪20萬的Python自動化開發人才。
掃描二維碼領取學習資料
更多Python好文請點選【閱讀原文】哦
↓↓↓