Python操作SQLite/MySQL/LMDB/LevelDB

      網友投稿 1001 2022-05-30

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

      http://blog.jobbole.com/92796/

      Python文檔關于sqlite3的介紹:

      https://docs.python.org/2/library/sqlite3.html

      Python操作SQLite/MySQL/LMDB/LevelDB

      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:

      http://skipperkongen.dk/2013/02/14/having-a-look-at-leveldb/

      開發者 關系型數據庫

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Huawei_LiteOS——STM32F1移植(野火開發板)
      下一篇:ADG單實例搭建系列之(Active Database Duplicate Using Image Copies)
      相關文章
      中文字幕亚洲精品资源网| 亚洲精品无码专区久久久 | 亚洲AV色欲色欲WWW| 亚洲午夜一区二区三区| 亚洲一级毛片中文字幕| 亚洲视频免费在线看| 久久亚洲AV成人无码| 亚洲综合区图片小说区| 91亚洲自偷在线观看国产馆| 亚洲国产成AV人天堂无码| 亚洲免费视频网址| 中文字幕 亚洲 有码 在线| 亚洲精品天堂在线观看| 亚洲中文字幕无码中文字| 亚洲另类无码专区丝袜| 亚洲AV永久无码精品放毛片| 激情小说亚洲图片| 伊在人亚洲香蕉精品区麻豆| 亚洲Av无码国产情品久久 | 亚洲成人免费网站| 亚洲天堂2017无码中文| 亚洲女子高潮不断爆白浆| 亚洲AV色欲色欲WWW| 亚洲国产成人a精品不卡在线| 亚洲一区视频在线播放| 亚洲人成亚洲人成在线观看| 国产亚洲精品精华液| 97亚洲熟妇自偷自拍另类图片 | 亚洲国产综合无码一区二区二三区| 中文字幕专区在线亚洲| 亚洲av无码一区二区三区不卡| 亚洲嫩模在线观看| 亚洲一级毛片免观看| 亚洲aⅴ无码专区在线观看春色| 亚洲AV无码之日韩精品| 亚洲乱码日产一区三区| 色拍自拍亚洲综合图区| 亚洲最大的黄色网| 国产精品亚洲专区无码WEB| 亚洲午夜爱爱香蕉片| 久久精品国产亚洲夜色AV网站|