写点什么

python 数据库编程,这篇是针对 mysql 的,滚雪球学 Python 第 4 季第 13 篇

发布于: 刚刚

在第一季滚雪球学 python 中,我们已经接触了 python 操作 sqlite,本篇博客为你介绍 python 与 mysql 和 nosql 之间的故事。


在正式学习之前,先确保你电脑上已经安装了 mysql 。


mysql 的安装博客:补充知识:2021 年 mysql 最新 windows 安装教程,滚雪球学 python 第四季

mysql 一些简单命令

对于 mysql 的细致学习,咱们应该单独开一个系列,这个 flag 先立下了,本文为了学习 python 操作 mysql 数据库,只能先做一些基本铺垫。


查看所有数据库


show databases;
复制代码


查看帮助


help
复制代码


退出 mysql


exit
复制代码


创建数据库


create database cadb;
复制代码


删除数据库


drop database cadb;
复制代码


使用某个数据库


use cadb;
复制代码


查看库表


show tables;
复制代码


查看表结构


desc 表名;
复制代码


除了上述内容外,你还要学习建表语句,删表语句,表中插入数据语句,表删除数据语句,表更新数据语句,这些稍后在 python 操作 mysql 中进行实现。

python 操作 mysql

操作数据库一般被程序员成为 CRUD 操作(增删改查),其中各个字符分别代表 C(Create) 新增,R(Read) 读取,U(Update) 更新,D(Delete) 删除。


在 python3 中推荐使用 pymysql 模块操作数据库,模块使用命令 pip install PyMySQL 进行安装。


在此之前,先通过 MySQL Command Line Client 创建一个表用来做测试。


新建库,新建表,插入数据 命令依次如下


show databases;create database cadb;use cadb;-- 建表语句create table user(name varchar(10),uid int,primary key(uid));
desc user;
复制代码


![python 数据库编程,这篇是针对 mysql 的,滚雪球学 Python 第 4 季第 13 篇](https://img-blog.csdnimg.cn/6cdb3743b239427e8f12b58327fa5a2d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5qKm5oOz5qmh55qu5pOm,size_20,color_FFFFFF,t_70,g_se,x_16 =400x)接下来在表中插入 2 条数据。


insert into user(name,uid) values ("橡皮擦",1);insert into user(name,uid) values ("CSDN",2);
复制代码


简单的查询 sql 如下所示:


select * from user;
复制代码


![python 数据库编程,这篇是针对 mysql 的,滚雪球学 Python 第 4 季第 13 篇](https://img-blog.csdnimg.cn/85b6673844b147818dbe4797b0531298.png =300x)下面就可以在 python 中编写操作该库表的相关代码了,数据库链接步骤如下:


  1. 连接数据库,生成连接对象;

  2. 创建游标对象,用于访问数据表;

  3. 执行 sql 语句;

  4. 关闭游标;

  5. 关闭连接。


python 查询数据 python 连接数据库获取数据


import pymysql
# python 连接数据库,返回数据库连接对象conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")print(conn)
复制代码


输出连接对象如下所示:


<pymysql.connections.Connection object at 0x00000000021E2F60>
复制代码


其中 connect 方法相关的参数可以依据名称进行判断。


接下来就是创建游标,提取数据。


# 通过 cursor() 创建游标对象,并让查询结果以字典格式输出cur = conn.cursor(cursor=pymysql.cursors.DictCursor)# 输出 <pymysql.cursors.DictCursor object at 0x0000000002C03B00>
复制代码


下一步使用游标对象 curexecute 方法执行 sql


cur.execute("select * from user")
复制代码


最后通过相关方法获取查询结果,本案例获取所有用户使用 fetchall 方法。


# 获取查询结果data = cur.fetchall()
复制代码


输入数据库检索的所有数据。


[{'name': '橡皮擦', 'uid': 1}, {'name': 'CSDN', 'uid': 2}]
复制代码


关闭游标,关闭连接


# 关闭游标cur.close()# 关闭数据库连接conn.close()
复制代码


接下来我们将其修改的复杂一些,检索特定数据,例如 uid=1 的数据,并且用到上下文管理器 with 进行对象的关闭。


第一种写法


import pymysql
# python 连接数据库,返回数据库连接对象conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")# print(conn)with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur: cur.execute("select * from user where uid = %s", 1) # 获取查询结果 data = cur.fetchall() print(data)
# 关闭数据库连接conn.close()
复制代码


第二种写法


import pymysql
# python 连接数据库,返回数据库连接对象conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")# print(conn)with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur: cur.execute("select * from user where uid = %(uid)s", {"uid": 1}) # 获取查询结果 data = cur.fetchall() print(data)
# 关闭数据库连接conn.close()
复制代码


两种写法,在 execute 方法参数存在差异,可直接对比学习。


python 更新数据表数据接下来演示的是使用 python 去更新表数据,例如将 uid = 2name 列更新为 Code


import pymysql
# python 连接数据库,返回数据库连接对象conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")# print(conn)with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur: try: cur.execute("update user set name =%s where uid = %s", ["Code", 2])
conn.commit() # 提交事务 except Exception as e: print("数据更新异常", e) conn.rollback() # 数据回滚
# 关闭数据库连接conn.close()
复制代码


上述代码核心为在执行 SQL 操作之后,需要使用事务处理,即 conn.commit 提交事务,确保当前修改生效,如果出现异常,还需要使用 conn.rollback 对提交事务进行回滚。


cursor. execute 可以返回受影响行数,可以直接通过该值判断是否修改成功。


本次代码还使用了 try-except 语句,对于 PyMySQL 模块内置的异常类,清单如下:


  • StandardError

  • Warning

  • Error

  • InterfaceError

  • DatabaseError

  • DataError

  • OperationalError

  • IntegrityError

  • ProgrammingError

  • NotSupportedError


python 新增数据表数据接下来演示增加数据,本次插入数据都采用硬编码,如果想创建一个自动递增的表字段,需要继续研究 sql 相关写法。


import pymysql
# python 连接数据库,返回数据库连接对象conn = pymysql.connect(host="127.0.0.1", user="root", password="xiangpica", database="cadb", charset="utf8")# print(conn)with conn.cursor(cursor=pymysql.cursors.DictCursor) as cur: try: affected = cur.execute("insert into user(name,uid) values (%s,%s)", ["Good", 3])
conn.commit() # 提交事务 print("受影响行数", affected) except Exception as e: print("数据插入异常", e) conn.rollback() # 数据回滚
# 关闭数据库连接conn.close()
复制代码


python 删除表格数据核心代码如下所示:


affected = cur.execute("delete from user where uid = %s", [3])conn.commit()  # 提交事务print("受影响行数", affected)
复制代码


写到这里,你可以自行完成一个 python 简单的数据库操作封装。

python 操作 nosql 之 dbm

mysql 数据关系型数据库,与之对应的就是非关系型数据库,例如 python 内置的 dbm(database manager )


第一个要学习的方法是 dbm.open,方法原型如下所示:


def open(file, flag='r', mode=0o666):
复制代码


flag 参数:


  • r : 只读;

  • w : 只写;

  • n : 总是创建一个数据库,打开方式为读写;

  • c : 存在不创建,不存在则创建。


关闭数据库使用 dbm.close(),使用 with 语句之后,不需要手动释放资源。


with dbm.open(xxx) as db:  pass
复制代码


dbm 存储的形式类似 python 字典,以键值对形式存在。


import dbm
with dbm.open('example.db', 'n') as db: db['name'] = '橡皮擦' # 存储值 db['age'] = '18' # values must be bytes or strings
复制代码


读取值使用 db[key] 即可,如果没有 key 值,提示 KeyError 错误。


import dbm
with dbm.open('example.db', 'r') as db: ca = db["name"] age = db["age"] print(ca)
复制代码


dbm 数据库保存的数据是字符串类型或者字节序列类型,读取到的值是字节序列类型,需要使用解码函数 decode 转换成字符串。


发布于: 刚刚阅读数: 2
用户头像

爬虫 100 例作者,蓝桥签约作者,博客专家 2021.02.06 加入

6 年产品经理+教学经验,3 年互联网项目管理经验; 互联网资深爱好者; 沉迷各种技术无法自拔,导致年龄被困在 25 岁; CSDN 爬虫 100 例作者。 个人公众号“梦想橡皮擦”。

评论

发布
暂无评论
python 数据库编程,这篇是针对 mysql 的,滚雪球学Python第4季第13篇