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全面学习:

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

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:

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

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/297646.html<

(0)
运维的头像运维
上一篇2025-05-22 13:51
下一篇 2025-05-22 13:52

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注