歡迎光臨
每天分享高質量文章

Python操作SQLite/MySQL/LMDB/LevelDB

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全面學習:

    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:

    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好文請點選【閱讀原文】哦

↓↓↓

贊(0)

分享創造快樂