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魔术方法详解
Feb 14 Python
用Python抢过年的火车票附源码
Dec 07 Python
Python网站验证码识别
Jan 25 Python
python 添加用户设置密码并发邮件给root用户
Jul 25 Python
transform python环境快速配置方法
Sep 27 Python
python使用pymongo操作mongo的完整步骤
Apr 13 Python
Python使用turtle库绘制小猪佩奇(实例代码)
Jan 16 Python
手把手教你进行Python虚拟环境配置教程
Feb 03 Python
python模拟点击网页按钮实现方法
Feb 25 Python
浅析pip安装第三方库及pycharm中导入第三方库的问题
Mar 10 Python
python中使用.py配置文件的方法详解
Nov 23 Python
Python机器学习之基于Pytorch实现猫狗分类
Jun 08 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语法(1)
2006/10/09 PHP
逐步提升php框架的性能
2008/01/10 PHP
php实现的在线人员函数库
2008/04/09 PHP
PHP通过内置函数memory_get_usage()获取内存使用情况
2014/11/20 PHP
PHP操作Redis常用技巧总结
2018/04/24 PHP
jQuery 数据缓存模块进化史详细介绍
2012/11/19 Javascript
原生js实现fadein 和 fadeout淡入淡出效果
2014/06/05 Javascript
jquery插件bootstrapValidator表单验证详解
2016/12/15 Javascript
js如何判断是否在iframe中及防止网页被别站用iframe嵌套
2017/01/11 Javascript
详解webpack + react + react-router 如何实现懒加载
2017/11/20 Javascript
浅谈AngularJS中$http服务的简单用法
2018/05/15 Javascript
更优雅的微信小程序骨架屏实现详解
2019/08/07 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
[17:00]DOTA2 HEROS教学视频教你分分钟做大人-帕克
2014/06/10 DOTA
Python open读写文件实现脚本
2008/09/06 Python
python 简易计算器程序,代码就几行
2009/08/29 Python
python列表操作使用示例分享
2014/02/21 Python
python中for语句简单遍历数据的方法
2015/05/07 Python
Django中对通过测试的用户进行限制访问的方法
2015/07/23 Python
实例讲解Python的函数闭包使用中应注意的问题
2016/06/20 Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
2017/06/20 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
详解Python 4.0 预计推出的新功能
2019/07/26 Python
Python实现手机号自动判断男女性别(实例解析)
2019/12/22 Python
pytorch实现建立自己的数据集(以mnist为例)
2020/01/18 Python
CSS3 三维变形实现立体方块特效源码
2016/12/15 HTML / CSS
HTML5拖拽文件上传的示例代码
2021/03/04 HTML / CSS
Julep官网:美容产品和指甲油
2017/02/25 全球购物
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
巾帼文明岗申报材料
2014/05/01 职场文书
个人收入证明模板
2014/09/18 职场文书
学历证明范文
2015/06/16 职场文书
追讨欠款律师函
2015/06/24 职场文书
班级班风口号大全
2015/12/25 职场文书
草系十大最强宝可梦,纸片人上榜,榜首大家最熟悉
2022/03/18 日漫