当前位置: 首页 > news >正文

使用Python操作Mysql数据库

目录

 一,使用python连接mysql数据库

安装必备软件

1,连接mysql数据库

2,插入数据(INSERT)

3,更新数据(UPDATE)

4,删除数据(DELETE)

5,执行多条SQL语句

6,模糊查询(LIKE)

二,使用连接池

1,创建连接池

三, 事务管理

1,事务的分类

 2,事务的隔离级别

3,事务隔离级别总结

在现代应用程序中,数据库扮演着至关重要的角色。MySQL是一个流行的关系型数据库管理系统(RDBMS),广泛应用于各种规模的应用中。在Python中,我们可以通过连接库与MySQL数据库进行交互,实现数据的增、删、改、查操作。与此同时,为了提高应用的性能,连接池作为一个优化数据库连接管理的技术,得到了广泛的应用。

  1. 使用python操作mysql数据库可以干什么?
  • 数据库连接:通过 MySQL Connector/Python 等驱动程序建立 Python 与 MySQL 的连接,需提供主机名、用户名、密码和数据库名等参数。
  • 游标对象:接成功后,创建游标对象执行 SQL 语句,游标充当 Python 程序与数据库之间的中介。
  • 执行SQL语句:使用游标执行查询、插入、更新或删除等 SQL 操作,并通过游标获取结果集或影响的行数。
  • 事务处理:数据库操作通常包含多个步骤,使用事务机制确保数据的一致性和完整性,支持提交或回滚操作。
  1. 主要好处有哪些
  • 高效的数据处理:Python 强大的数据处理能力与 MySQL 的高性能存储相结合,适合处理大量数据。
  • 应用开发便利:在 Web 应用、数据分析工具等开发中,可无缝集成数据库功能。
  • 跨平台兼容性:Python 和 MySQL 均支持多平台,便于系统部署和迁移。
  • 数据可视化:结合 Matplotlib、Seaborn 等库,可将数据库中的数据直观展示。
  • 自动化操作:通过脚本实现数据库管理自动化,如定时备份、数据清洗等。

 一,使用python连接mysql数据库

需要准备两台虚拟机

192.168.10.101python远程连接
192.168.10.102MySQL数据库

安装必备软件

##如果安装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,事务隔离级别总结

  1. READ UNCOMMITTED:允许脏读,最低的隔离级别,性能最好,但容易出现数据不一情况
  2. READ COMMITTED:解决了脏读问题,但可能出现不可重复读。
  3. REPEATABLE READ:解决了脏读和不可重复读问题,但可能出现幻读。
  4. SERIALIZABLE:解决了所有问题,但性能最差,可能导致事务长时间等待。

 

相关文章:

  • 赋能电力FTU,飞凌嵌入式RK3506核心板AMP双系统技术应用解析
  • 解决:ERROR: No matching distribution found for matplotlib= =3.8.3
  • SQL每日一练(2)
  • 【esp32 WIFI连接】-STA模式
  • SpringBoot多环境配置文件切换
  • 高速串行差分信号仿真分析及技术发展挑战续
  • TF-IDF和词袋模型
  • Python实用工具:文件批量重命名器
  • MySQL分库分表
  • 对神经正切核的理解和推导(1)
  • 浅析SpringBoot中的classpath
  • 互联网和以太网之是什么与区别
  • DVWA文件上传笔记
  • 踩坑记录:RecyclerView 局部刷新notifyItemChanged多次调用只触发一次 onBindViewHolder 的原因
  • 数据库调优与数据表的范式设计
  • LangGraph:部署智能应用
  • 在 .NET 环境下实现跨进程高频率读写数据
  • 再论自然数全加和-3
  • 使用CodeBuddy实现网页自动连点器
  • 【通用技巧】技术文章工业级指南:目标定位、架构设计与持续演进
  • 做视频网站视频短片/微信营销推广软件
  • 阿里巴巴如何建设网站首页/郑州网络推广排名
  • wordpress需要编程技术嘛/优化营商环境条例解读
  • 有没有做皮艺的网站/官网seo关键词排名系统
  • 国外的浏览器/河池网站seo
  • 个人网站备案 名称/微商引流人脉推广软件