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查找函数f(x)=0根的解决方法
May 07 Python
剖析Python的Twisted框架的核心特性
May 25 Python
浅谈python中的面向对象和类的基本语法
Jun 13 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
May 26 Python
Django网络框架之HelloDjango项目创建教程
Jun 06 Python
python多线程并发及测试框架案例
Oct 15 Python
pytorch 模型的train模式与eval模式实例
Feb 20 Python
pycharm开发一个简单界面和通用mvc模板(操作方法图解)
May 27 Python
详解python UDP 编程
Aug 24 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
Aug 02 Python
一篇文章弄懂Python中的内建函数
Aug 07 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
apache+php+mysql安装配置方法小结
2010/08/01 PHP
php实现网站顶踩功能的完整前端代码
2015/07/19 PHP
Laravel框架执行原生SQL语句及使用paginate分页的方法
2018/08/17 PHP
JScript中的undefined和"undefined"的区别
2007/03/08 Javascript
非常强大的 jQuery.AsyncBox 弹出对话框插件
2011/08/29 Javascript
分享一道笔试题[有n个直线最多可以把一个平面分成多少个部分]
2012/10/12 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
JQuery的$命名冲突详细解析
2013/12/28 Javascript
JS实现的倒计时效果实例(2则实例)
2015/12/23 Javascript
深入学习jQuery Validate表单验证
2016/01/18 Javascript
又一款js时钟!transform实现时钟效果
2016/08/15 Javascript
提高JavaScript执行效率的23个实用技巧
2017/03/01 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
vue-router动态设置页面title的实例讲解
2018/08/30 Javascript
vue中更改数组中属性,在页面中不生效的解决方法
2019/10/30 Javascript
在NodeJs中使用node-schedule增加定时器任务的方法
2020/06/08 NodeJs
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
github配置使用指南
2014/11/18 Python
Python中datetime常用时间处理方法
2015/06/15 Python
详解Python中的日志模块logging
2015/06/19 Python
Python的条件语句与运算符优先级详解
2015/10/13 Python
Python生成器定义与简单用法实例分析
2018/04/30 Python
Python异常的检测和处理方法
2018/10/26 Python
对Python中实现两个数的值交换的集中方法详解
2019/01/11 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
matplotlib图例legend语法及设置的方法
2020/07/28 Python
CSS3实现莲花绽放的动画效果
2020/11/06 HTML / CSS
物流仓储实习自我鉴定
2013/09/25 职场文书
物流管理专业毕业生自荐信
2014/03/04 职场文书
小学生母亲节演讲稿
2014/05/07 职场文书
假面舞会策划方案
2014/05/29 职场文书
大学生党性分析材料
2014/12/19 职场文书
2015年学校安全工作总结
2015/04/22 职场文书
Python中tqdm的使用和例子
2022/09/23 Python