Python 数据库操作
文章目录
Python 数据库操作
前言
基础环境
一、Python操作数据库简介
二、PyMySQL
2.1、设备清单
2.2、在Python主机安装pymysql模块
2.3、数据库主机安装mariadb
2.4、在mariadb01上创建数据库
2.5、pymysql使用
2.6、数据库增删改查
2.6.1、增加记录
2.6.2、查询记录
2.6.3、修改记录
2.6.4、删除记录
2.6.7、编辑查询结果
前言
前面的章节中学习了使用Python读写文件的方法,大家可以用文件方式来存放数据,不过使用文件的方式不容易管理,同时还容易丢失会带来许多问题。目前主流的方法都是采用数据库软件,通过数据库软件来组织和存放数据,不管是读还是存都非常方便,速度也有保障。本篇介绍Python操作MySQL数据库软件的方法。
基础环境
关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
关闭内核安全机制
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
修改主机名
hostnamectl set-hostname python
hostnamectl set-hostname mariadb01
hostnamectl set-hostname mariadb02
一、Python操作数据库简介
数据库(Database)是按照数据结构组织、存储和管理建立在计算机存储设备上的数据仓库。MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发。MySQL是一个可移植的数据库,技术能在当前所有操作系统上运行,如Unix/Linux、Windows、Mac和Solaris。MySQL采用标准的SQL语句(结构化查询语言),SQL是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
虽然Python可以支持数据的本地存储,但前提是先从数据库获取才能保存下来,同时还无法存储过多的数据,因为数据释放和使用会占用较大的内存,数据库负责把磁盘数据组织好放回内存,Python负责在内容中操作数据。
二、PyMySQL
PyMySQL是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同。但目前PyMySQL支持Python3.x,而MySQLdb不支持3.x版本。
本章节我们来学习PyMySQL模块对数据库的操作。
2.1、设备清单
设备 |
IP地址 |
软件包 |
备注 |
python主机 |
192.168.93.101 |
python3.11.6 |
|
mariadb01 |
192.168.93.102 |
mariadb-server |
|
mariadb02 |
192.168.93.103 |
mariadb-server |
|
2.2、在Python主机安装pymysql模块
通过pip安装PyMySQL的命令:
[root@python ~]# pip3 install pymysql
2.3、数据库主机安装mariadb
所有Mariadb主机都要执行
# 安装数据库
yum -y install mariadb-server
# 启动数据库
systemctl enable mariadb.service --now
# 设置数据库密码
mysqladmin -u root password '123456'
# 授权
mysql -u root -p123456
grant all on *.* to root@'%' identified by '123456';
2.4、在mariadb01上创建数据库
use test;
create table users (id int(11) not null auto_increment,email varchar(255),password varchar(255),primary key (id));
2.5、pymysql使用
在前面的课程中,已经详细的介绍过了MySQL的安装及配置过程,在本章将不过多阐述。现在我们安装一个Mariadb数据库,并登录Mariadb实例,在test库中创建一张users表,root账户密码为"123456",代码如下。
实例1:使用PyMySQL模块连接MySQL数据库向users表插入一条记录并查询这条记录:
[root@python ~]# cat pymysql-1.py
import pymysql
connection = pymysql.connect(host='192.168.93.102', user='root', password='123456', db='test', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) # 以字典的形式返回操作结果
try:
with connection.cursor() as cursor:
sql = "INSERT INTO `users` (`email`, `password`) VALUES (%s, %s)" # 要执行的 sql 语句
cursor.execute(sql, ('zhangsan@qq.com', 'pwd123'))
connection.commit()
with connection.cursor() as cursor:
sql = "SELECT `id`, `password` FROM `users` WHERE `email`=%s"
cursor.execute(sql, ('zhangsan@qq.com'))
result = cursor.fetchall()
print(result)
finally:
connection.close()
[root@python ~]# python3 pymysql-1.py
[{'id': 5, 'password': 'pwd123'}]
[root@mariadb01 ~]# mysql -uroot -p123456
MariaDB [(none)]> use test;
MariaDB [test]> select * from users;
+----+-----------------+----------+
| id | email | password |
+----+-----------------+----------+
| 5 | zhangsan@qq.com | pwd123 |
+----+-----------------+----------+
1 row in set (0.00 sec)
从代码的执行结果中,可以看到数据库表中已经成功插入了一条记录。
代码说明,先创建一个连接对象,下面是一个异常处理。如果连接成功,执行 INSERT 语句并提交,再执行 SELECT 语句,获取查询的第一条记录并打印;finally 是最终执行关闭连接。在上面示例中用到了 pymysql.connect()函数,还有游标对象 cursor,下面具体看下它们的用法。
表 7-1 是pymysql.connect()函数的常用参数。
参数 |
描述 |
host |
数据库主机地址 |
user |
数据库账户 |
password |
账户密码 |
db |
使用的数据库 |
port |
数据库主机端口,默认3306 |
connect_timeout |
连接超时时间,默认10,单位秒 |
charset |
使用的字符集 |
cursorclass |
自定义游标使用的类。上面示例用的是字典类,以字典形式返回结果,默认是元组形式 |
表 7-2 是 pymysql 连接对象常用方法
方法 |
描述 |
commit() |
提交事务。对支持事务的数据库和表,如果提交修改操作,不适用这个方法,则不会写到数据库中 |
rollback() |
事务回滚。对支持事务的数据库和表,如果执行此方法,则回顾当前事务,放弃之前的操作 |
cursor([cursorclass]) |
创建一个游标对象。所有的 sql 语句的执行都要在游标对象下进行 |
表 7-3 是游标对象常用方法
方法 |
描述 |
close() |
关闭游标 |
execute(sql) |
执行 sql 语句 |
excutemany(sql) |
执行多条 sql 语句 |
fetchone() |
从执行结果中取第一条记录 |
fetchmany(n) |
从执行结果中取 n 条记录 |
fetchall() |
从执行结果中取所有记录 |
2.6、数据库增删改查
了解 pymysql 基本用法,现在使用上面的这些方法实现数据库的增、删、改、查功能。
2.6.1、增加记录
示例2:在 users 表里再添加一条记录
>>> import pymysql
>>> connection = pymysql.connect(host='192.168.93.102', user='root',password='123456',db='test',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)
>>> cursor=connection.cursor()
>>> sql="insert into users (email,password) values('lisi@qq.com','pwd123')"
>>> cursor.execute(sql)
1 # 代表数据库被 1 条语句受影响(也就是插入了 1 条数据)
>>> connection.commit()
>>> connection.close()
2.6.2、查询记录
示例3:查询 users 表记录
>>> import pymysql
>>> connection = pymysql.connect(host='192.168.93.102', user='root',password='123456',db='test')
>>> cursor=connection.cursor()
>>> sql="select id,email,password from users"
>>> cursor.execute(sql)
2
>>> connection.commit()
>>> connection.close()
>>> cursor.fetchone() # 获取第一条记录
(5, 'zhangsan@qq.com', 'pwd123')
>>> cursor.fetchmany(2) # 获取前两条记录
((6, 'lisi@qq.com', 'pwd123'),)
2.6.3、修改记录
修改用户密码
>>> import pymysql
>>> connection = pymysql.connect(host='192.168.93.102', user='root',password='123456',db='test',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor)
>>> cursor=connection.cursor()
>>> sql="update users set password='456789' where email='lisi@qq.com'"
>>> cursor.execute(sql)
1
>>> connection.commit()
>>> sql="select id,email,password from users"
>>> cursor.execute(sql) # 执行 sql 语句
2
>>> cursor.fetchmany(2) # 显示前两条记录
[{'id': 5, 'email': 'zhangsan@qq.com', 'password': 'pwd123'}, {'id': 6, 'email': 'lisi@qq.com', 'password': '456789'}]
2.6.4、删除记录
删除用户信息
>>> sql="delete from users where email='lisi@qq.com'"
>>> cursor.execute(sql)
1
>>> connection.commit()
>>> sql="select id,email,password from users where email=%s"
>>> cursor.execute(sql,('zhangsan@qq.com'))
1
>>> cursor.execute(sql,('lisi@qq.com'))
0
>>> sql="select id,email,password from users"
>>> cursor.execute(sql)
1
>>> cursor.fetchall()
[{'id': 5, 'email': 'zhangsan@qq.com', 'password': 'pwd123'}]
2.6.7、编辑查询结果
示例6:查询 users 表所有email与密码
[root@python ~]# cat pymysql-2.py
import pymysql
connection = pymysql.connect(host='192.168.93.102', user='root', password='123456', db='test', charset='utf8mb4', cursorclass=pymysql.cursors.DictCursor) # 以字典的形式返回操作结果
try:
with connection.cursor() as cursor:
sql = "select id,email,password from users"
cursor.execute(sql)
result = cursor.fetchall()
for dict in result:
print("email: %s, password= %s" % (dict['email'],dict['password']))
finally:
connection.close()
[root@python ~]# python3 pymysql-2.py
email: zhangsan@qq.com, password= pwd123
email: lisi@qq.com, password= pwd123
email: wangwu@qq.com, password= pwd123
email: zhaoliu@qq.com, password= pwd123
作者:云教员