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 Web框架
Mar 20 Python
Python实现翻转数组功能示例
Jan 12 Python
Python去除、替换字符串空格的处理方法
Apr 01 Python
如何使用Python的Requests包实现模拟登陆
Apr 27 Python
浅述python中深浅拷贝原理
Sep 18 Python
Python面向对象程序设计中类的定义、实例化、封装及私有变量/方法详解
Feb 28 Python
python多进程并行代码实例
Sep 30 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
Python如何访问字符串中的值
Feb 09 Python
学习python需要有编程基础吗
Jun 02 Python
python数据类型强制转换实例详解
Jun 22 Python
Spy++的使用方法及下载教程
Jan 29 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的朋友 经常问的一些问题。不断更新
2011/08/11 PHP
php遍历文件夹下的所有文件和子文件夹示例
2014/03/20 PHP
php判断访问IP的方法
2015/06/19 PHP
[原创]PHP正则匹配中英文、数字及下划线的方法【用户名验证】
2017/08/01 PHP
window.open被浏览器拦截后的自定义提示效果代码
2007/11/19 Javascript
前台js改变Session的值(用ajax实现)
2012/12/28 Javascript
js 动态为textbox添加下拉框数据源的方法
2014/04/24 Javascript
ES6中非常实用的新特性介绍
2016/03/10 Javascript
基于JS模仿windows文件按名称排序效果
2016/06/29 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
js实现省份下拉菜单效果
2017/02/15 Javascript
Jquery把获取到的input值转换成json
2017/05/15 jQuery
React Native 通告消息竖向轮播组件的封装
2020/08/25 Javascript
Vuejs 2.0 子组件访问/调用父组件的方法(示例代码)
2018/02/08 Javascript
基于Node.js实现压缩和解压缩的方法
2018/02/13 Javascript
vue2.0 自定义 饼状图 (Echarts)组件的方法
2018/03/02 Javascript
微信小程序button标签open-type属性原理解析
2020/01/21 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
[13:16]INFAMOUS vs VGJ T BO3
2018/06/07 DOTA
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
python实现域名系统(DNS)正向查询的方法
2016/04/19 Python
Python爬虫工程师面试问题总结
2018/03/22 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
python用opencv完成图像分割并进行目标物的提取
2020/05/25 Python
python3.6.8 + pycharm + PyQt5 环境搭建的图文教程
2020/06/11 Python
django下创建多个app并设置urls方法
2020/08/02 Python
简约控的天堂:The Undone
2016/12/21 全球购物
争论的故事教学反思
2014/02/06 职场文书
股东授权委托书
2014/10/15 职场文书
课外活动实习计划
2015/01/19 职场文书
失职检讨书大全
2015/01/26 职场文书
宣传稿格式范文
2015/07/23 职场文书
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
排查并解决MySQL生产库内存使用率高的报警
2022/04/11 MySQL