使用 Python 的 pymysql 库连接到 MySQL 数据库 并执行 查询语句 的案例
代码解释:
-
导入
pymysql
库:使用import pymysql
导入pymysql
库,以便后续使用其数据库连接和操作功能。 -
建立数据库连接:通过
pymysql.connect()
方法连接到 MySQL 数据库,指定主机、端口、用户名、密码、数据库名等信息。 -
创建游标对象:使用
connection.cursor()
创建游标对象,用于执行 SQL 语句并获取结果。 -
定义并执行 SQL 查询:将你提供的 SQL 查询语句存储在
sql
变量中,然后使用游标对象的execute()
方法执行该查询。 -
获取并处理查询结果:使用
cursor.fetchall()
方法获取所有查询结果,然后遍历结果并打印每个部门中薪水最高的员工信息。 -
异常处理:使用
try - except
块捕获可能出现的数据库连接错误或查询执行错误,并打印错误信息。 -
关闭数据库连接:无论是否发生异常,最后都使用
connection.close()
方法关闭数据库连接,确保资源被正确释放。
注意事项:
-
请确保
dept_emp
和salaries
表存在于aike
数据库中,并且表结构与 SQL 查询语句中的列名匹配。 -
若数据库不在本地,需要将
host
参数修改为实际的数据库主机地址;若使用的不是默认端口 3306,需要相应调整port
参数。
具体代码:
import pymysql
# 导入 pymysql 库,该库允许 Python 程序与 MySQL 数据库进行交互。
# 通过它,我们可以连接到 MySQL 数据库、执行 SQL 语句、获取查询结果等。
try:
# 建立数据库连接
connection = pymysql.connect(
host='localhost',
# 指定数据库所在的主机地址,这里假设数据库在本地运行,所以使用 'localhost'。
# 如果数据库部署在其他服务器上,需要将此值修改为相应服务器的 IP 地址或域名。
port=3306,
# 指定连接数据库时使用的端口号,MySQL 默认端口是 3306。
# 如果数据库使用了非默认端口,需要将此值修改为实际使用的端口号。
user='root',
# 指定连接数据库时使用的用户名,这里使用的是 MySQL 的超级用户 'root'。
# 不同的用户名可能具有不同的数据库操作权限。
password='root',
# 指定连接数据库时该用户对应的密码,用于验证用户身份。
database='aike',
# 指定要连接的数据库名称,这里是 'aike' 数据库。
# 后续的 SQL 操作将在这个数据库中执行。
charset='utf8mb4',
# 指定字符编码为 'utf8mb4',它支持更广泛的字符集,包括 emoji 等特殊字符。
# 确保在处理不同语言和特殊字符时不会出现乱码问题。
cursorclass=pymysql.cursors.DictCursor
# 指定游标类为 DictCursor,这样查询结果将以字典形式返回。
# 方便我们通过列名来访问结果集中的数据。
)
print("成功连接到数据库!")
# 如果连接成功,打印提示信息。
# 使用连接对象创建一个游标对象
with connection.cursor() as cursor:
# 使用 with 语句创建游标对象,它可以帮助我们自动管理游标资源,确保在使用完后正确关闭。
# 游标用于执行 SQL 语句并处理查询结果。
# 定义 SQL 查询语句
sql = """
SELECT
emp_no,
dept_no,
salary
FROM (
SELECT
dept_emp.emp_no,
dept_emp.dept_no,
salaries.salary,
RANK() OVER (PARTITION BY dept_emp.dept_no ORDER BY salaries.salary DESC) as salary_rank
FROM
dept_emp
JOIN
salaries ON dept_emp.emp_no = salaries.emp_no
) ranked
WHERE
salary_rank = 1;
"""
# 这是一个复杂的 SQL 查询语句,用于找出每个部门中薪水最高的员工信息。
# 内部子查询通过 JOIN 操作将 dept_emp 表和 salaries 表根据员工编号(emp_no)连接起来,
# 并使用 RANK() 窗口函数按照部门编号(dept_no)进行分区,对每个部门内的员工薪水进行降序排名,
# 排名结果存储在 salary_rank 列中。
# 外部查询从子查询结果中筛选出排名为 1 的记录,即每个部门中薪水最高的员工记录。
# 执行 SQL 查询
cursor.execute(sql)
# 使用游标对象的 execute() 方法执行定义好的 SQL 查询语句。
# 获取所有查询结果
results = cursor.fetchall()
# 使用游标对象的 fetchall() 方法获取查询结果集中的所有记录。
# 由于我们使用了 DictCursor,结果将以字典列表的形式返回,每个字典代表一行记录。
print("每个部门中薪水最高的员工信息:")
# 打印提示信息。
for result in results:
# 遍历查询结果列表。
print(f"员工编号: {result['emp_no']}, 部门编号: {result['dept_no']}, 薪水: {result['salary']}")
# 打印每个部门中薪水最高的员工的信息,包括员工编号、部门编号和薪水。
except pymysql.Error as e:
# 捕获 pymysql 操作过程中可能出现的异常。
print(f"连接数据库或执行查询时出现错误: {e}")
# 如果出现异常,打印错误信息。
finally:
# 无论是否发生异常,都会执行 finally 块中的代码。
# 确保数据库连接资源被正确关闭。
# 无论是否发生异常,都关闭数据库连接
if connection:
# 检查连接对象是否存在。
connection.close()
# 如果连接对象存在,使用 close() 方法关闭数据库连接。
print("数据库连接已关闭。")
# 打印数据库连接已关闭的提示信息。