使用Python操作Mysql数据库
目录
一,使用python连接mysql数据库
安装必备软件
1,连接mysql数据库
2,插入数据(INSERT)
3,更新数据(UPDATE)
4,删除数据(DELETE)
5,执行多条SQL语句
6,模糊查询(LIKE)
二,使用连接池
1,创建连接池
三, 事务管理
1,事务的分类
2,事务的隔离级别
3,事务隔离级别总结
在现代应用程序中,数据库扮演着至关重要的角色。MySQL是一个流行的关系型数据库管理系统(RDBMS),广泛应用于各种规模的应用中。在Python中,我们可以通过连接库与MySQL数据库进行交互,实现数据的增、删、改、查操作。与此同时,为了提高应用的性能,连接池作为一个优化数据库连接管理的技术,得到了广泛的应用。
- 使用python操作mysql数据库可以干什么?
- 数据库连接:通过 MySQL Connector/Python 等驱动程序建立 Python 与 MySQL 的连接,需提供主机名、用户名、密码和数据库名等参数。
- 游标对象:接成功后,创建游标对象执行 SQL 语句,游标充当 Python 程序与数据库之间的中介。
- 执行SQL语句:使用游标执行查询、插入、更新或删除等 SQL 操作,并通过游标获取结果集或影响的行数。
- 事务处理:数据库操作通常包含多个步骤,使用事务机制确保数据的一致性和完整性,支持提交或回滚操作。
- 主要好处有哪些
- 高效的数据处理:Python 强大的数据处理能力与 MySQL 的高性能存储相结合,适合处理大量数据。
- 应用开发便利:在 Web 应用、数据分析工具等开发中,可无缝集成数据库功能。
- 跨平台兼容性:Python 和 MySQL 均支持多平台,便于系统部署和迁移。
- 数据可视化:结合 Matplotlib、Seaborn 等库,可将数据库中的数据直观展示。
- 自动化操作:通过脚本实现数据库管理自动化,如定时备份、数据清洗等。
一,使用python连接mysql数据库
需要准备两台虚拟机
192.168.10.101 | python远程连接 |
192.168.10.102 | MySQL数据库 |
安装必备软件
##如果安装2太慢可以使用以下命令指定安装源
pip3 config set global.index-url http://mirrors.aliyun.com/pypi/simple
pip3 config set install.trusted-host mirrors.aliyun.com
pip3 install --upgrade pip##安装pymysql模块
pip3 install pymysql
1,连接mysql数据库
在连接数据前需要在101虚拟机安装mysql并测试是否可以远程连接
##101操作
[root@localhost ~]# dnf -y install mysql ##安装dnf方式的mysql##102mysql数据库操作
create user 'root'@'%' identified by '123456'; ##创建一个用于101登陆的用户
grant all on *.* to 'root'@'%';##101操作
[root@localhost ~]# mysql -uroot -p123456 -h192.168.10.102 ##验证是否可以远程登陆
mysql> ##在102数据库准备好要测试的数据,users表在testdb数据库中
mysql> select * from users;
+----+---------+-----+
| id | name | age |
+----+---------+-----+
| 1 | Alice | 25 |
| 2 | Bob | 30 |
| 3 | Charlie | 35 |
| 4 | David | 28 |
+----+---------+-----+
4 rows in set (0.00 sec)
-
使用python连接数据库
[root@localhost ~]# python3 1.py ##创建用于连接数据库的脚本文件,后缀必须为.py
##导入连接库
import pymysql
##创建数据库连接
db=pymysql.connect(host="192.168.10.102",user="root",password="123456",database="testdb")
##创建游标对象
cursor=db.cursor()
##执行SQL语句
cursor.execute("select * from users")
##获取查询结果
results=cursor.fetchall()
##显示查询结果
for row in results:print(row)
##关闭连接
cursor.close() ##关闭游标
db.close() ##关闭数据库连接##由于脚本中写的是查询语句,运行脚本可以看到users表中的内容
[root@localhost ~]# python3 1.py
(1, 'Alice', 25)
(2, 'Bob', 30)
(3, 'Charlie', 35)
(4, 'David', 28)
2,插入数据(INSERT)
[root@localhost ~]# vim 1.py ##直接在此部分添加两行,执行插入命令
##执行SQL语句
cursor.execute("insert into users(name,age) values(%s,%s)",("zhangsan",20))
db.commit()
cursor.execute("select * from users")[root@localhost ~]# python3 1.py
(1, 'Alice', 25)
(2, 'Bob', 30)
(3, 'Charlie', 35)
(4, 'David', 28)
(7, 'zhangsan', 20) ##可以看到zhagnsan用户以被插入到表中## values(%s,%s):插入语句中的值应使用%s占位符
3,更新数据(UPDATE)
[root@localhost ~]# vim 1.py
##执行SQL语句
cursor.execute("update users set age=%s where name=%s",(26,"zhangsan"))
db.commit()
cursor.execute("select * from users")##执行脚本将zhangsan用户的年龄修改为26
[root@localhost ~]# python3 1.py
(1, 'Alice', 25)
(2, 'Bob', 30)
(3, 'Charlie', 35)
(4, 'David', 28)
(7, 'zhangsan', 26)
4,删除数据(DELETE)
[root@localhost ~]# vim 1.py ##继续修改脚本,删除zhangsan用户
##执行SQL语句
cursor.execute("delete from users where name=%s",("zhangsan",))
db.commit()
cursor.execute("select * from users")[root@localhost ~]# python3 1.py
(1, 'Alice', 25)
(2, 'Bob', 30)
(3, 'Charlie', 35)
(4, 'David', 28)
5,执行多条SQL语句
[root@localhost ~]# vim 1.py ##修改语句批量添加aaa,bbb,ccc用户
##执行SQL语句
cursor.executemany("insert into users (name,age) values (%s,%s)",[("aaa",30),("bbb",22),("ccc",18)])
db.commit()
cursor.execute("select * from users")[root@localhost ~]# python3 1.py
(1, 'Alice', 25)
(2, 'Bob', 30)
(3, 'Charlie', 35)
(4, 'David', 28)
(11, 'aaa', 30)
(12, 'bbb', 22)
(13, 'ccc', 18)
6,模糊查询(LIKE)
[root@localhost ~]# vim 1.py ##修改脚本,添加几行数据
##执行SQL语句
cursor.execute("insert into users(name,age) values(%s,%s)",("zhangsan",20))
cursor.execute("insert into users(name,age) values(%s,%s)",("lisi",20))
cursor.execute("insert into users(name,age) values(%s,%s)",("wangwu",20))
db.commit()
cursor.execute("select * from users")[root@localhost ~]# python3 1.py
(1, 'Alice', 25)
(2, 'Bob', 30)
(3, 'Charlie', 35)
(4, 'David', 28)
(8, 'zhangsan', 20)
(9, 'lisi', 20)
(10, 'wangwu', 20)##执行SQL语句 ##查看年龄为20的用户
cursor.execute("select * from users where age like %s",("%20%",)) [root@localhost ~]# python3 1.py
(8, 'zhangsan', 20)
(9, 'lisi', 20)
(10, 'wangwu', 20)
二,使用连接池
连接池技术能够在高并发场景下提升数据库连接的效率。在连接池中,多个数据库连接被提前创建并放入池中,客户端通过池获取连接,而不是每次都建立新的连接。这大大减少了连接创建和销毁的开销。连接池的优势:
- 性能提升: 连接池减少了每次数据库操作时创建新连接的开销,提高了数据库操作的效率。
- 资源管理: 连接池能够限制最大连接数,避免因过多的数据库连接导致数据库过载。
- 更易管理: 通过连接池,可以统一管理连接的生命周期,简化代码结构。
1,创建连接池
pip3 install dbutils ##安装dbutils工具
[root@localhost ~]# vim aaa.py
import pymysqlfrom dbutils.pooled_db import PooledDBdbconfig={"host":"192.168.10.102","user":"root","password":"123456","database":"testdb"}connection_pool=PooledDB(creator=pymysql,maxconnections=5,**dbconfig)db_connection=connection_pool.connection()
cursor=db_connection.cursor()cursor.execute("select * from users")
results=cursor.fetchall()for row in results:print(row)cursor.close()
db_connection.close()[root@localhost ~]# python3 aaa.py
(1, 'Alice', 25)
(2, 'Bob', 30)
(3, 'Charlie', 35)
(4, 'David', 28)
(8, 'zhangsan', 20)
....../省略部分内容
- host:数据库服务器地址
- user:用户名
- passowrd:密码
- database:要连接的数据库名
- creator=pymysql:指定用pymysql驱动
- maxconnections=5:最大连接数为5
- **dbconfig:解包配置参数
- db_connection=connection_pool.connection():从连接池 (
connection_pool
) 中获取一个可用的数据库连接对象 (db_connection
) - cursor=db_connection.cursor():创建一个游标对象 (
cursor
) 用于执行 SQL 语句并处理结果 - cursor.execute("select * from users"):执行 SQL 查询语句,从
users
表中检索所有列和行的数据 - results=cursor.fetchall():将数据库服务器端的查询结果全部获取到 Python 程序中
- for row in results print(row):将内容输出到屏幕中
- cursor.close() db_connection.close():退出游标,退出连接 连接会自动归还个连接池,
三, 事务管理
事务是由多个 SQL语句组成的一个工作单元。事务保证了数据的原子性,即所有操作要么都成功,要么都失败。
1,事务的分类
cursor.execute("start transaction") ##开始事务
db.commit() ##提交事务
db.rollback() ##回滚事务
2,事务的隔离级别
- READ UNCOMMITTED(未提交读)
事务可以读取其他事务未提交的数据,可能导致“脏读”(Dirty Read)。这种级别下,事务间的隔离性最差。
使用方法:CurSor.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
- READ COMMITTED(提交读)
事务只能读取其他事务已经提交的数据,避免了脏读,但仍然可能遇到“不可重复读”(Non-repeatable Read)的问题。即事务中读取的数据在两次读取时可能发生变化(另-个事务已提交了修改)。
使用方法:
cursor.execute("SET TRANSACTION ISOLATION LEVEL READ COMMITTED")
- REPEATABLE READ(可重复读)
描述:事务可以保证在事务内多次读取同一数据时,其值不会发生变化。这避免了“不可重复读”的问题,但依然可能会出现“幻读”(Phantom Read),即一个事务读取的数据集在事务执行过程中发生了变化。
使用方法:
cursor,execute("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ" )
- SERIALIZABLE(串行化)
这是最严格的事务隔离级别,事务会被执行得像串行一样,完全避免了脏读、不可复读和幻读。然而,这种隔离级别的性能开销最大,可能导致大量的锁竞争。
使用方法:
cursor.execute("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE")
3,事务隔离级别总结
- READ UNCOMMITTED:允许脏读,最低的隔离级别,性能最好,但容易出现数据不一情况
- READ COMMITTED:解决了脏读问题,但可能出现不可重复读。
- REPEATABLE READ:解决了脏读和不可重复读问题,但可能出现幻读。
- SERIALIZABLE:解决了所有问题,但性能最差,可能导致事务长时间等待。