python操作MySQL数据库

一,安装pythonMySQL链接库

Python有多个MySQL连接库可供选择,以下是主流的三种:

  1. mysql-connector-python - MySQL官方提供的纯Python实现
  2. PyMySQL - 纯Python实现的MySQL客户端
  3. MySQLdb - C语言实现的传统连接库(仅支持Python2/Python3)

1,安装mysql-connector-python

复制代码
pip3 install mysql-connector-python

2,安装pymysql(作为替代)

复制代码
pip3 install pymysql

二,python连接MySQL数据库

1,导入链接库

复制代码
import pymysql

2,创建数据库连接

我们使用 pymysql.connect()方法来建立数据库连接。连接时需要提供MySQL服务器的地址、用户名密码和要访问的数据库名。

复制代码
db=pymysql.connect(host='192.168.10.101',user='root',password='pwd123',database='testdb')

3,创建游标对象

复制代码
cursor=db.cursor()

4,执行SQL语句

复制代码
cursor.execute("select * from users")

5,获取查询结果

复制代码
results=cursor.fetchall()
for row in results:
    print(row)

6,关闭连接

复制代码
cursor.close()
db.close()

三,常见的MySQL操作

1,插入数据

复制代码
cursor.execute("insert into users (name, age) values (%s, %s)", ("alice", 25))	
db.commit()

2,更新数据

复制代码
cursor.execute("update users set age = %s where name = %s", (26, "alice"))
db.commit()

3,删除数据

复制代码
cursor.execute("delete from users where name = %s",("alice",))
db.commit()

4,查询数据

复制代码
cursor.execute("select * from users")
results=cursor.fetchall()
for row in results:
print(row)

5,使用like进行模糊查询

复制代码
cursor.execute("select * from users where name like %s", ("%a%",))
results=cursor.fetchall()
for row in results:
    print(row)

6,使用join进行联合查询

复制代码
cursor.execute("""
SELECT users.name,orders.amountFROM usersINNER JOIN orders ON users.id =orders.user id""")
results =cursor.fetchall()
for row in results:
    print(row)

四,使用连接池,

1,连接池简介

连接池(Connection Pool)是一种用于管理数据库连接的技术架构,它通过预先创建并维护一定数量的数据库连接,在应用程序需要时从池中获取连接,使用完毕后归还给池而不是直接关闭,从而实现连接的高效复用。

2,创建连接池

复制代码
from dbutils.pooled_db import PooledDB
import pymysql
dbconfig={"host":"192.168.10.101","user":"root","password":"pwd123","database":"testdb"}
connection_pool=PooledDB(creator=pymysql,maxconnection=5,**dbconfig)

3,获取连接

复制代码
db_connection=connection_pool.connection()
cursor=db_connection.cursor()
cursor.execute("select * from users")
results=cursor.fetchall()
for fow in results:
print(row)
cursor.close()
db_connection.close()

4,连接池的优势

  1. 性能提升:避免了频繁创建和销毁连接的开销,通常数据库连接的建立需要100ms以上。

  2. 资源控制:可以限制最大连接数,防止系统过载。例如设置最大连接数为100。

  3. 连接复用:同一个连接可以被多个请求循环使用,提高了资源利用率。

  4. 统一管理:集中处理连接问题,如超时重连、心跳检测等。

五,事务管理

事务管理是数据库系统和分布式计算中的核心概念,它确保一组操作要么全部成功执行,要么全部不执行,从而维护数据的完整性和一致性。事务管理在现代企业应用中扮演着至关重要的角色,特别是在金融交易、电子商务和关键业务系统中。

1,开始事务

复制代码
cursor.execute("start transaction")

2,提交事务

复制代码
db.commit()

3,回滚事务

复制代码
db.rollback()

4,事务的隔离级别

(1)READ UNCOMMITTED(未提交读)

最低级别,允许读取未提交的数据变更。

  • 问题:可能导致"脏读"(Dirty Read)

    cursor.execute("set transaction isolation level read uncommitted")

(2)READ COMMITTED(提交读)

只能读取已提交的数据。

  • 问题:可能导致"不可重复读"(Non-repeatable Read)

    cursor.execute("set transaction isolation level read uncommitted")

(3)REPEATABLE READ(可重复读)

确保在同一事务中多次读取同样数据结果一致。

  • 问题:可能导致"幻读"(Phantom Read)

    cursor.execute("set transaction isolation level repeatable read,")

(4)SETIALIZABLE(串行化)

最高隔离级别,完全串行执行事务。

  • 优点:避免所有并发问题

  • 缺点:性能最低

    cursor.execute("set transaction isolation level sertaltzable")

5,事务隔离级别总结

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

在选择事务隔高级别时,需要根据应用的具体需求平衡数据一致性和性能。如果事务数据不频繁冲突可以选择较低的隔离级别以提升性能,而对于数据一致性要求极高的场景,则应选择更高的隔离级别,尽管这会带来性能上的损失。

在MySQ中,事务的认隔离级别是REPEATABLE READ

6,案例

复制代码
import pymysq1
conn = pymysql.connect("host":"192.168.10.101","user":"root","password":"pwd123","database":"testdb")
cursor=conn.cursor()
conn.autocomit= False
try:
cursor.execute("INSERT INTO users(name, age)VALUES('Eve',22)")cursor.execute("INSERT INTO orders (user id, amount)VALUES((SELECT id FROM users WHERE name='Eve'),120.50)")
conn .commit()
print("事务已提交。")
except pymysql.MySQLError as err:
print(f"错误:{err}")conn.rollback()
print("事务已回滚。")
finally :
cursor.close()
conn.close()
相关推荐
鸽鸽程序猿8 分钟前
【JavaEE】Spring事务
数据库·spring·java-ee
涤生大数据39 分钟前
面试加分秘籍:校招数据倾斜场景下的SQL优化方案
数据库·sql·校招
比特森林探险记44 分钟前
MySQL 窗口函数深度解析:语法、应用场景与性能优化
数据库·mysql
LFloyue1 小时前
mongodb集群之副本集
数据库·mongodb
文牧之1 小时前
PostgreSQL 内置扩展列表
运维·数据库·postgresql
玄尺_0071 小时前
bug: uniCloud 查询数组字段失败
数据库·bug
Auc242 小时前
物流项目第九期(MongoDB的应用之作业范围)
java·数据库·mongodb
Hello.Reader2 小时前
Redis C语言连接教程
c语言·数据库·redis
JyHuai422 小时前
linux安装MYSQL
数据库·mysql
.生产的驴2 小时前
SpringBoot 执行Lua脚本 服务端执行 减少性能损耗 优化性能 优化连接性能
java·数据库·spring boot·后端·junit·maven·lua