44 Python MySQL(PyMySQL 驱动)
python里,对数据库的操作,除了上一篇介绍的mysql-connector库,MySQL也是广泛应用的开源关系型数据库。
一、安装与准备
在命令行里输入以下命令就可以完成安装:pip install PyMySQL。
二、创建数据库
以下是创建一个名为 test_db
的数据库的示例代码:
import pymysql# 建立与 MySQL 服务器的连接
try:db = pymysql.connect(host='localhost',user='leo',password='123456')cursor = db.cursor()# 创建数据库的 SQL 语句create_database_sql = "CREATE DATABASE IF NOT EXISTS test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci"try:cursor.execute(create_database_sql)print("数据库创建成功")except pymysql.Error as e:print(f"创建数据库时出错: {e}")
finally:if db:db.close()
在上述代码中,我们先建立与 MySQL 服务器的连接并获取游标,然后使用
CREATE DATABASE
语句创建数据库。IF NOT EXISTS
确保在数据库不存在时才创建,避免重复创建导致的错误。CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci
用于设置数据库的字符集和排序规则,以支持更广泛的字符存储和处理。如果创建过程中出现错误,会捕获异常并打印错误信息,最后关闭数据库连接。
三、建立连接
数据库创建好之后,我们就可以连接到这个数据库进行后续操作了。下面是一个连接到刚才创建的 test_db
数据库的 Python 代码示例:
import pymysql# 建立数据库连接
try:db = pymysql.connect(host='localhost',user='leo',password='123456',database = "test_db")print("成功连接到 MySQL 服务器")
except pymysql.Error as e:print(f"连接 MySQL 服务器时出错: {e}")
四、数据操作:增删改查
4.1 创建数据库表
在创建好数据库后,我们可以在其中创建表来存储数据。以下是在 test_db
数据库中创建一个名为 user_info
的表的示例:
import pymysql# 建立数据库连接
db = pymysql.connect(host='localhost',user='leo',password='123456',database='test_db'
)cursor = db.cursor()# 如果表存在则删除
cursor.execute("DROP TABLE IF EXISTS user_info")# 创建表的 SQL 语句
sql = """
CREATE TABLE user_info (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(255) NOT NULL,age INT
)
"""try:cursor.execute(sql)print("表创建成功")
except pymysql.Error as e:print(f"创建表时出错: {e}")
finally:db.close()
上述代码中,先获取数据库游标,然后使用
DROP TABLE IF EXISTS
语句删除可能存在的同名表,再执行CREATE TABLE
语句创建新表。若创建成功会打印提示信息,出错则捕获异常并打印错误信息,最后关闭数据库连接。
4.2 插入数据
向表中插入数据是常见的操作。以下是插入一条员工记录的示例:
import pymysql# 建立数据库连接
db = pymysql.connect(host='localhost',user='leo',password='123456',database='test_db'
)cursor = db.cursor()# SQL 插入语句
sql = "INSERT INTO user_info (name, age) VALUES (%s, %s)"
val = ("张三", 25)try:cursor.execute(sql, val)db.commit()print(f"{cursor.rowcount} 条记录插入成功")
except pymysql.Error as e:db.rollback()print(f"插入数据时出错: {e}")
finally:db.close()
这里使用
INSERT INTO
语句插入数据,通过execute()
方法执行 SQL 语句,使用commit()
提交事务。如果插入过程中出现错误,会回滚事务并打印错误信息。
4.3 查询数据
从表中查询数据是获取信息的重要手段。以下是查询所有员工记录的示例:
import pymysql# 建立数据库连接
db = pymysql.connect(host='localhost',user='leo',password='123456',database='test_db'
)cursor = db.cursor()# SQL 查询语句
sql = "SELECT * FROM user_info WHERE age > %s"
val = (20,)try:cursor.execute(sql, val)results = cursor.fetchall()for row in results:id = row[0]name = row[1]age = row[2]print(f"ID: {id}, 姓名: {name}, 年龄: {age}")
except pymysql.Error as e:print(f"查询数据时出错: {e}")
finally:db.close()
此代码通过
SELECT
语句查询满足条件的数据,使用fetchall()
方法获取所有查询结果并遍历打印。若查询出错,捕获异常并打印错误信息。
4.4 更新数据
当数据发生变化时,需要对表中的数据进行更新。以下是将员工 “张三” 的年龄更新为 26 的示例:
import pymysql# 建立数据库连接
db = pymysql.connect(host='localhost',user='leo',password='123456',database='test_db'
)cursor = db.cursor()# SQL 更新语句
sql = "UPDATE user_info SET age = %s WHERE name = %s"
val = (26, "张三")try:cursor.execute(sql, val)db.commit()print(f"{cursor.rowcount} 条记录更新成功")
except pymysql.Error as e:db.rollback()print(f"更新数据时出错: {e}")
finally:db.close()
这里使用
UPDATE
语句更新数据,同样通过execute()
执行语句,commit()
提交事务。若更新出错则回滚事务并打印错误。
4.5 删除数据
如果某些数据不再需要,可以将其从表中删除。以下是删除名为 “张三” 的员工记录的示例:
import pymysql# 建立数据库连接
db = pymysql.connect(host='localhost',user='leo',password='123456',database='test_db'
)cursor = db.cursor()# SQL删除语句
sql = "DELETE FROM user_info WHERE name = %s"
val = ("张三",)try:cursor.execute(sql, val)db.commit()print(f"{cursor.rowcount} 条记录删除成功")
except pymysql.Error as e:db.rollback()print(f"删除数据时出错: {e}")
finally:db.close()
这段代码使用
DELETE FROM
语句删除满足条件的数据,执行语句和提交事务的操作与前面类似,出错时回滚并打印错误。
五、事务处理:保障数据一致性
事务具有原子性、一致性、隔离性和持久性(ACID)四个特性,它能确保数据库操作的可靠性。在 PyMySQL 中,事务提供了 commit
和 rollback
方法。
import pymysql# 建立数据库连接
db = pymysql.connect(host='localhost',user='leo',password='123456',database='test_db'
)cursor = db.cursor()# 多条 SQL 语句组成一个事务
sql1 = "INSERT INTO user_info (name, age) VALUES (%s, %s)"
val1 = ("李四", 28)
sql2 = "UPDATE user_info SET age = age + 1 WHERE name = %s"
val2 = ("李四",)try:cursor.execute(sql1, val1)cursor.execute(sql2, val2)db.commit()print("事务执行成功")
except pymysql.Error as e:db.rollback()print(f"事务执行出错,已回滚: {e}")
finally:db.close()
在这个示例中,包含插入和更新两条 SQL 语句,它们组成一个事务。如果所有语句都执行成功,就提交事务;若其中有错误,会回滚整个事务,保证数据的一致性。
六、错误处理:应对异常情况
在使用 PyMySQL 进行数据库操作时,可能会遇到各种错误。PyMySQL 定义了一系列异常类来处理这些情况,比如 Warning
表示严重警告,Error
是所有其他错误的基类,还有 InterfaceError
(数据库接口模块错误)、DatabaseError
(数据库相关错误)等。
import pymysqltry:db = pymysql.connect(host='localhost',user='leo',password='123456',database='test_db')cursor = db.cursor()sql = "SELECT * FROM non_existent_table"cursor.execute(sql)
except pymysql.ProgrammingError as e:print(f"编程错误: {e},可能是表不存在或 SQL 语法错误")
except pymysql.Error as e:print(f"数据库操作出错: {e}")
finally:if db:db.close()
七、删除数据库
import pymysql# 建立与 MySQL 服务器的连接
try:connection = pymysql.connect(host="localhost",user="leo",password="123456")cursor = connection.cursor()# 要删除的数据库名称database_name = "test_db"# 删除数据库的 SQL 语句delete_database_query = f"DROP DATABASE IF EXISTS {database_name}"# 执行 SQL 语句cursor.execute(delete_database_query)print(f"数据库 {database_name} 已成功删除。")except pymysql.Error as err:print(f"操作过程中出现错误: {err}")
finally:if connection:cursor.close()connection.close()print("数据库连接已关闭。")
八、总结
- 掌握 PyMySQL 的安装方法,根据系统情况选择合适的安装方式。
- 学会使用
pymysql.connect()
方法连接 MySQL 服务器和数据库,连接时确保各项参数正确。 - 熟练运用
CREATE DATABASE
、CREATE TABLE
、INSERT INTO
、SELECT
、UPDATE
、DELETE
等 SQL 语句进行数据库和数据表的创建,以及数据的增删改查操作。 - 理解事务的概念,使用
commit
和rollback
方法保证数据一致性。 - 学会捕获和处理 PyMySQL 中不同类型的异常,提高程序的稳定性和健壮性。