经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » SQLite » 查看文章
Python操作SQLite/MySQL/LMDB数据库的方法
来源:jb51  时间:2019/11/7 20:23:29  对本文有异议

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建立数据库与建立表

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

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

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

2.3.2插入、删除、修改

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

  1. #! /usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3.  
  4. # Author : MaYi
  5. # Blog : http://www.cnblogs.com/mayi0312/
  6. # Date : 2019-11-07
  7. # Name : test01
  8. # Software : PyCharm
  9. # Note :
  10. import sqlite3
  11.  
  12.  
  13. # 创建链接
  14. conn = sqlite3.connect(":memory:")
  15. # 创建光标
  16. cur = conn.cursor()
  17. # 执行(创建数据表的)SQL语句
  18. cur.execute("CREATE TABLE students (sid INTEGER PRIMARY KEY, name TEXT)")
  19. # 执行(插入)SQL语句
  20. cur.execute("INSERT INTO students VALUES(?, ?)", (1, "Alice"))
  21. cur.execute("INSERT INTO students VALUES(?, ?)", (2, "Bob"))
  22. cur.execute("INSERT INTO students VALUES(?, ?)", (3, "Peter"))
  23. # 执行(查询)SQL语句
  24. cur.execute("SELECT * FROM students")
  25. print(cur.fetchall()) # [(1, 'Alice'), (2, 'Bob'), (3, 'Peter')]
  26. # 执行(删除)SQL语句
  27. cur.execute("DELETE FROM students WHERE sid = ?", (1,))
  28. # 执行(查询)SQL语句
  29. cur.execute("SELECT * FROM students")
  30. print(cur.fetchall()) # [(2, 'Bob'), (3, 'Peter')]
  31. # 执行(修改)SQL语句
  32. cur.execute("UPDATE students SET name = ? WHERE sid = ?", ("Mark", 3))
  33. # 执行(查询)SQL语句
  34. cur.execute("SELECT * FROM students")
  35. print(cur.fetchall()) # [(2, 'Bob'), (3, 'Mark')]
  36. # 关闭链接
  37. conn.close()

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

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

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

2.3.3查询

  直接用上面的代码:

  1. # 执行(查询)SQL语句
  2. cur.execute("SELECT * FROM students")
  3. print(cur.fetchall()) # [(2, 'Bob'), (3, 'Peter')]
  4.   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用户名及其密码。

  ·数据库连接

  1. #! /usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3.  
  4. # Author : MaYi
  5. # Blog : http://www.cnblogs.com/mayi0312/
  6. # Date : 2019-11-07
  7. # Name : test02
  8. # Software : PyCharm
  9. # Note :
  10. # 导入模块
  11. import pymysql
  12.  
  13. # 创建数据库连接
  14. conn = pymysql.connect(
  15. host="localhost",
  16. port=3306,
  17. db="testdb",
  18. user="mayi",
  19. password="test123",
  20. charset="utf8")
  21. # 创建游标
  22. cur = conn.cursor()
  23. # 执行SQL语句(查询Mysql版本)
  24. cur.execute("SELECT VERSION()")
  25. # 获取单条数据
  26. data = cur.fetchone()
  27. # 打印:Database version: 5.7.17-log
  28. print("Database version: %s " % data)
  29. # 关闭数据库连接
  30. conn.close()

  ·建立表

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

  1. #! /usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3.  
  4. # Author : MaYi
  5. # Blog : http://www.cnblogs.com/mayi0312/
  6. # Date : 2019-11-07
  7. # Name : test02
  8. # Software : PyCharm
  9. # Note :
  10. # 导入模块
  11. import pymysql
  12.  
  13. # 创建数据库连接
  14. conn = pymysql.connect(
  15. host="localhost",
  16. port=3306,
  17. db="testdb",
  18. user="mayi",
  19. password="test123",
  20. charset="utf8")
  21. # 创建游标
  22. cur = conn.cursor()
  23. # 执行SQL语句,如果表存在则删除
  24. cur.execute("DROP TABLE IF EXISTS students")
  25. # 使用预处理语句创建表
  26. cre_sql = """CREATE TABLE students (
  27. sid INT(4) PRIMARY KEY,
  28. name VARCHAR(10)
  29. )"""
  30. # 执行SQL语句(建表)
  31. cur.execute(cre_sql)
  32.  
  33. # 关闭数据库连接
  34. conn.close()

3.3.2插入、删除、修改

  1. #! /usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3.  
  4. # Author : MaYi
  5. # Blog : http://www.cnblogs.com/mayi0312/
  6. # Date : 2019-11-07
  7. # Name : test02
  8. # Software : PyCharm
  9. # Note :
  10. # 导入模块
  11. import pymysql
  12.  
  13. # 创建数据库连接
  14. conn = pymysql.connect(
  15. host="localhost",
  16. port=3306,
  17. db="testdb",
  18. user="mayi",
  19. password="test123",
  20. charset="utf8")
  21. # 创建游标
  22. cur = conn.cursor()
  23.  
  24. # 执行(插入)SQL语句
  25. cur.execute("INSERT INTO students(sid, name) VALUES(%s, '%s')" % (1, 'Alice'))
  26. cur.execute("INSERT INTO students(sid, name) VALUES(%s, '%s')" % (2, 'Bob'))
  27. cur.execute("INSERT INTO students(sid, name) VALUES(%s, '%s')" % (3, 'Peter'))
  28. # 执行(查询)SQL语句
  29. cur.execute("SELECT * FROM students")
  30. print(cur.fetchall()) # ((1, 'Alice'), (2, 'Bob'), (3, 'Peter'))
  31. # 执行(删除)SQL语句
  32. cur.execute("DELETE FROM students WHERE sid = %s" % (1,))
  33. # 执行(查询)SQL语句
  34. cur.execute("SELECT * FROM students")
  35. print(cur.fetchall()) # ((2, 'Bob'), (3, 'Peter'))
  36. # 执行(修改)SQL语句
  37. cur.execute("UPDATE students SET name = '%s' WHERE sid = %s" % ('Mark', 3))
  38. # # 执行(查询)SQL语句
  39. cur.execute("SELECT * FROM students")
  40. print(cur.fetchall()) # ((2, 'Bob'), (3, 'Mark'))
  41. # 提交
  42. conn.commit()
  43. # 关闭数据库连接
  44. conn.close()

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

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

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

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

  1. #! /usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3.  
  4. # Author : MaYi
  5. # Blog : http://www.cnblogs.com/mayi0312/
  6. # Date : 2019-11-07
  7. # Name : test02
  8. # Software : PyCharm
  9. # Note :
  10. # 导入模块
  11. import pymysql
  12.  
  13. # 创建数据库连接
  14. conn = pymysql.connect(
  15. host="localhost",
  16. port=3306,
  17. db="testdb",
  18. user="mayi",
  19. password="test123",
  20. charset="utf8")
  21. # 创建游标
  22. cur = conn.cursor()
  23.  
  24. # 执行(查询)SQL语句
  25. cur.execute("SELECT * FROM students")
  26. # 返回影响的行数
  27. print(cur.rowcount) # 2
  28. # 取一条数据
  29. print(cur.fetchone()) # (2, 'Bob')
  30. # 取剩下所有数据
  31. print(cur.fetchall()) # ((3, 'Mark'),)
  32. # 关闭数据库连接
  33. 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建立环境

  1. #! /usr/bin/env python3
  2. # -*- coding:utf-8 -*-
  3.  
  4. # Author : MaYi
  5. # Blog : http://www.cnblogs.com/mayi0312/
  6. # Date : 2019-11-07
  7. # Name : test03
  8. # Software : PyCharm
  9. # Note :
  10. import lmdb
  11.  
  12. # 打开环境
  13. env = lmdb.open("students")

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

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

4.3.2插入、删除、修改

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

  1. import lmdb
  2.  
  3.  
  4. # 打开环境
  5. env = lmdb.open("students")
  6. # 建立事务
  7. txn = env.begin(write=True)
  8. # 插入三条记录
  9. txn.put(b"1", b"Alice")
  10. txn.put(b"2", b"Bob")
  11. txn.put(b"3", b"Peter")
  12. # 删除key="1"的记录
  13. txn.delete(b"1")
  14. # 修改key="3"的值为"Mark"
  15. txn.put(b"3", b"Mark")
  16. # 提交更改
  17. txn.commit()

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

4.3.3查询

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

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

5.学习总结

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

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

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号