Python操作SQLite/MySQL/LMDB数据库的方法


Posted in Python onNovember 07, 2019

1.概述

1.1前言

最近在存储字模图像集的时候,需要学习LMDB,趁此机会复习了SQLite和MySQL的使用,一起整理在此。

1.2环境

使用win7,Python 3.5.2。

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可以看这里:SQLite - Python

总结起来就是用cursor.execute()执行SQL语句,改变数据(插入、删除、修改)时用connection.commit()提交变更,查询数据时用cursor.fetchall()得到查询结果。

2.3操作实例

2.3.1建立数据库与建立表

#! /usr/bin/env python3
# -*- coding:utf-8 -*-
# Author  : MaYi
# Blog   : http://www.cnblogs.com/mayi0312/
# Date   : 2019-11-07
# Name   : test01
# Software : PyCharm
# Note   : 
import sqlite3
# 创建连接
conn = sqlite3.connect("test.db")
# 创建光标
cur = conn.cursor()
# 执行(创建数据表的)SQL语句
cur.execute("CREATE TABLE IF NOT EXISTS students (sid INTEGER PRIMARY KEY, name TEXT)")
# 提交
conn.commit()
# 关闭连接
conn.close()

这里conn是与数据库文件test.db的连接对象,cur是conn的光标对象,通过cur.execute()执行建表操作,创建了简单的学生信息表(学号, 名字),通过conn.commit()提交,最后用conn.close()关闭连接。

创建连接时,发现数据库文件不存在时会自动创建,这里使用了文件“test.db”,也可以使用“:memory:”建立内存数据库。

2.3.2插入、删除、修改

为了便于多次运行,直接使用了内存数据库:

#! /usr/bin/env python3
# -*- coding:utf-8 -*-

# Author  : MaYi
# Blog   : http://www.cnblogs.com/mayi0312/
# Date   : 2019-11-07
# Name   : test01
# Software : PyCharm
# Note   : 
import sqlite3


# 创建链接
conn = sqlite3.connect(":memory:")
# 创建光标
cur = conn.cursor()
# 执行(创建数据表的)SQL语句
cur.execute("CREATE TABLE students (sid INTEGER PRIMARY KEY, name TEXT)")
# 执行(插入)SQL语句
cur.execute("INSERT INTO students VALUES(?, ?)", (1, "Alice"))
cur.execute("INSERT INTO students VALUES(?, ?)", (2, "Bob"))
cur.execute("INSERT INTO students VALUES(?, ?)", (3, "Peter"))
# 执行(查询)SQL语句
cur.execute("SELECT * FROM students")
print(cur.fetchall()) # [(1, 'Alice'), (2, 'Bob'), (3, 'Peter')]
# 执行(删除)SQL语句
cur.execute("DELETE FROM students WHERE sid = ?", (1,))
# 执行(查询)SQL语句
cur.execute("SELECT * FROM students")
print(cur.fetchall()) # [(2, 'Bob'), (3, 'Peter')]
# 执行(修改)SQL语句
cur.execute("UPDATE students SET name = ? WHERE sid = ?", ("Mark", 3))
# 执行(查询)SQL语句
cur.execute("SELECT * FROM students")
print(cur.fetchall()) # [(2, 'Bob'), (3, 'Mark')]
# 关闭链接
conn.close()

做的事情还就非常简单易懂的,向学生信息表中插入(1, Alice)、(2, Bob)、(3, Peter)三条记录,删除(1, Alice),修改(3, Peter)为(3, Mark)。插入、删除、修改后查询数据库中的内容并打印出来。

“?”是sqlite3中的占位符,execute时会用第二个参数元组里的元素按顺序替换。官方文档里建议出于安全考虑,不要直接用Python做字符串拼接。

另外,注意不需要每次execute后调用commit。

2.3.3查询

直接用上面的代码:

# 执行(查询)SQL语句
cur.execute("SELECT * FROM students")
print(cur.fetchall()) # [(2, 'Bob'), (3, 'Peter')]
fetchall()返回的是记录数组,可能通过WHERE子句做更细致的选择。

3.MySQL

3.1准备

安装MySQL:略(百度)

安装pymysql:

pip install PyMySQL

3.2操作流程

同为关系型数据库,MySQL的操作方法与SQLite是大同小异的。建立连接对象与光标对象,用execute()执行SQL语句,commit()提交事物,fetchall()获得所有查询结果。

3.3操作实例

3.3.1建立与数据库连接与建立表

准备工作:

-   已经创建了数据库TESTDB

-   连接数据库TESTDB使用的用户名为“mayi”,密码为“test123”,你可以自己设定或者直接使用root用户名及其密码。

·数据库连接

#! /usr/bin/env python3
# -*- coding:utf-8 -*-

# Author  : MaYi
# Blog   : http://www.cnblogs.com/mayi0312/
# Date   : 2019-11-07
# Name   : test02
# Software : PyCharm
# Note   : 
# 导入模块
import pymysql

# 创建数据库连接
conn = pymysql.connect(
  host="localhost",
  port=3306,
  db="testdb",
  user="mayi",
  password="test123",
  charset="utf8")
# 创建游标
cur = conn.cursor()
# 执行SQL语句(查询Mysql版本)
cur.execute("SELECT VERSION()")
# 获取单条数据
data = cur.fetchone()
# 打印:Database version: 5.7.17-log 
print("Database version: %s " % data)
# 关闭数据库连接
conn.close()

·建立表

如果数据库连接存在我们可以使用execute()方法来为数据库创建表,如下所示创建表students

#! /usr/bin/env python3
# -*- coding:utf-8 -*-

# Author  : MaYi
# Blog   : http://www.cnblogs.com/mayi0312/
# Date   : 2019-11-07
# Name   : test02
# Software : PyCharm
# Note   : 
# 导入模块
import pymysql

# 创建数据库连接
conn = pymysql.connect(
  host="localhost",
  port=3306,
  db="testdb",
  user="mayi",
  password="test123",
  charset="utf8")
# 创建游标
cur = conn.cursor()
# 执行SQL语句,如果表存在则删除
cur.execute("DROP TABLE IF EXISTS students")
# 使用预处理语句创建表
cre_sql = """CREATE TABLE students (
    sid INT(4) PRIMARY KEY,
    name VARCHAR(10)
    )"""
# 执行SQL语句(建表)
cur.execute(cre_sql)

# 关闭数据库连接
conn.close()

3.3.2插入、删除、修改

#! /usr/bin/env python3
# -*- coding:utf-8 -*-

# Author  : MaYi
# Blog   : http://www.cnblogs.com/mayi0312/
# Date   : 2019-11-07
# Name   : test02
# Software : PyCharm
# Note   : 
# 导入模块
import pymysql

# 创建数据库连接
conn = pymysql.connect(
  host="localhost",
  port=3306,
  db="testdb",
  user="mayi",
  password="test123",
  charset="utf8")
# 创建游标
cur = conn.cursor()

# 执行(插入)SQL语句
cur.execute("INSERT INTO students(sid, name) VALUES(%s, '%s')" % (1, 'Alice'))
cur.execute("INSERT INTO students(sid, name) VALUES(%s, '%s')" % (2, 'Bob'))
cur.execute("INSERT INTO students(sid, name) VALUES(%s, '%s')" % (3, 'Peter'))
# 执行(查询)SQL语句
cur.execute("SELECT * FROM students")
print(cur.fetchall()) # ((1, 'Alice'), (2, 'Bob'), (3, 'Peter'))
# 执行(删除)SQL语句
cur.execute("DELETE FROM students WHERE sid = %s" % (1,))
# 执行(查询)SQL语句
cur.execute("SELECT * FROM students")
print(cur.fetchall()) # ((2, 'Bob'), (3, 'Peter'))
# 执行(修改)SQL语句
cur.execute("UPDATE students SET name = '%s' WHERE sid = %s" % ('Mark', 3))
# # 执行(查询)SQL语句
cur.execute("SELECT * FROM students")
print(cur.fetchall()) # ((2, 'Bob'), (3, 'Mark'))
# 提交
conn.commit()
# 关闭数据库连接
conn.close()

3.3.3查询

Python查询MySQL使用fetchone()方法获取单条数据,使用fetchall()方法获取多条数据。

·fetchone():该方法获取下一个查询结果集。结果集是一个对象。

·fetchall():接收全部的返回结果条。

·rowcount:这是一个只读属性,并返回执行execute()方法后影响的行数。

#! /usr/bin/env python3
# -*- coding:utf-8 -*-

# Author  : MaYi
# Blog   : http://www.cnblogs.com/mayi0312/
# Date   : 2019-11-07
# Name   : test02
# Software : PyCharm
# Note   : 
# 导入模块
import pymysql

# 创建数据库连接
conn = pymysql.connect(
  host="localhost",
  port=3306,
  db="testdb",
  user="mayi",
  password="test123",
  charset="utf8")
# 创建游标
cur = conn.cursor()

# 执行(查询)SQL语句
cur.execute("SELECT * FROM students")
# 返回影响的行数
print(cur.rowcount) # 2
# 取一条数据
print(cur.fetchone()) # (2, 'Bob')
# 取剩下所有数据
print(cur.fetchall()) # ((3, 'Mark'),)
# 关闭数据库连接
conn.close()

4.LMDB

4.1准备

LMDB和SQLite/MySQL等关系型数据库不同,属于key-value数据库(把LMDB想成dict会比较容易理解),键key与值value都是字符串。

安装:

pip install lmdb

使用时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建立环境

#! /usr/bin/env python3
# -*- coding:utf-8 -*-

# Author  : MaYi
# Blog   : http://www.cnblogs.com/mayi0312/
# Date   : 2019-11-07
# Name   : test03
# Software : PyCharm
# Note   : 
import lmdb

# 打开环境
env = lmdb.open("students")

运行一下,查看当前目录的变化:

 

可以看到当前目录下多了students目录,里面有data.mdb和lock.mdb两个文件。

4.3.2插入、删除、修改

插入与修改都用put实现,删除用delete实现。

import lmdb


# 打开环境
env = lmdb.open("students")
# 建立事务
txn = env.begin(write=True)
# 插入三条记录
txn.put(b"1", b"Alice")
txn.put(b"2", b"Bob")
txn.put(b"3", b"Peter")
# 删除key="1"的记录
txn.delete(b"1")
# 修改key="3"的值为"Mark"
txn.put(b"3", b"Mark")
# 提交更改
txn.commit()

注意用txn=env.begin()创建事务时,有write=True才能够写数据库。

4.3.3查询

查音箱记录用get(key),遍历数据库用cursor。

import lmdb
# 打开环境
env = lmdb.open("students")
# 建立事务
txn = env.begin()
# 查询单条记录
print(txn.get(b"3")) # b'Mark'
# b'2' b'Bob'
# b'3' b'Mark'
for key, value in txn.cursor():
  print(key, value)
# 提交更改
txn.commit()

5.学习总结

最后回顾一下,SQLite与MySQL都是关系型数据库,操作时创建连接对象connection与光标对象cursor,通过execute执行SQL语句,commite提交变更,fetch得到查询结果;LMDB是key-value数据库,操作时建立与数据库的连接,用put/delete改变数据,用get获取数据。

以上所述是小编给大家介绍的Python操作SQLite/MySQL/LMDB数据库的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python THREADING模块中的JOIN()方法深入理解
Feb 18 Python
使用Python的Django框架实现事务交易管理的教程
Apr 20 Python
详解django中url路由配置及渲染方式
Feb 25 Python
Python代码太长换行的实现
Jul 05 Python
基于YUV 数据格式详解及python实现方式
Dec 09 Python
Python PyInstaller安装和使用教程详解
Jan 08 Python
Jupyter notebook快速入门教程(推荐)
May 18 Python
什么是python的必选参数
Jun 21 Python
Keras预训练的ImageNet模型实现分类操作
Jul 07 Python
python对输出的奇数偶数排序实例代码
Dec 04 Python
python四个坐标点对图片区域最小外接矩形进行裁剪
Jun 04 Python
python元组打包和解包过程详解
Aug 02 Python
Flask框架路由和视图用法实例分析
Nov 07 #Python
Python 切分数组实例解析
Nov 07 #Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 #Python
Flask框架请求钩子与request请求对象用法实例分析
Nov 07 #Python
Django框架ORM数据库操作实例详解
Nov 07 #Python
Python程序暂停的正常处理方法
Nov 07 #Python
浅析python redis的连接及相关操作
Nov 07 #Python
You might like
PHP下MAIL的另一解决方案
2006/10/09 PHP
PHP生成HTML静态页面实例代码
2008/08/31 PHP
PHP COOKIE设置为浏览器进程
2009/06/21 PHP
探讨:如何使用PHP实现计算两个日期间隔的年、月、周、日数
2013/06/13 PHP
php实现与erlang的二进制通讯实例解析
2014/07/23 PHP
Thinkphp3.2实用篇之计算型验证码示例
2017/02/09 PHP
Laravel给生产环境添加监听事件(SQL日志监听)
2017/06/19 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
Prototype Array对象 学习
2009/07/19 Javascript
ASP Json Parser修正版
2009/12/06 Javascript
浅谈JavaScript 浏览器对象
2016/06/03 Javascript
AngularJS入门教程之链接与图片模板详解
2016/08/19 Javascript
Canvas 制作动态进度加载水球详解及实例代码
2016/12/09 Javascript
js生成随机数方法和实例
2017/01/17 Javascript
Vue2.x中的父子组件相互通信的实现方法
2017/05/02 Javascript
原生js轮播特效
2017/05/18 Javascript
Textarea输入字数限制实例(兼容iOS&安卓)
2017/07/06 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
react以create-react-app为基础创建项目
2018/03/14 Javascript
vue悬浮可拖拽悬浮按钮的实例代码
2019/08/20 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
Windows上使用Python增加或删除权限的方法
2018/04/24 Python
python输出国际象棋棋盘的实例分享
2020/11/26 Python
用python查找统一局域网下ip对应的mac地址
2021/01/13 Python
使用python实现学生信息管理系统
2021/02/25 Python
详解CSS3中强大的filter(滤镜)属性
2017/06/29 HTML / CSS
三星新西兰官网:Samsung新西兰
2019/03/05 全球购物
圣彼得堡鲜花配送:Semicvetic
2020/09/15 全球购物
大学生个人推荐信范文
2013/11/25 职场文书
医院护士的求职信范文
2013/12/26 职场文书
大学毕业寄语大全
2014/04/10 职场文书
电子商务助理求职自荐信
2014/04/10 职场文书
应聘会计求职信
2014/06/11 职场文书
python将图片转为矢量图的方法步骤
2021/03/30 Python
如何利用Python实现一个论文降重工具
2021/07/09 Python
详解MySQL的内连接和外连接
2023/05/08 MySQL