使用 Python 的 pymysql 库连接到 MySQL 数据库 并执行 查询语句

使用 Python 的 pymysql 库连接到 MySQL 数据库 并执行 查询语句 的案例

代码解释:

  1. 导入 pymysql 库:使用 import pymysql 导入 pymysql 库,以便后续使用其数据库连接和操作功能。

  2. 建立数据库连接:通过 pymysql.connect() 方法连接到 MySQL 数据库,指定主机、端口、用户名、密码、数据库名等信息。

  3. 创建游标对象:使用 connection.cursor() 创建游标对象,用于执行 SQL 语句并获取结果。

  4. 定义并执行 SQL 查询:将你提供的 SQL 查询语句存储在 sql 变量中,然后使用游标对象的 execute() 方法执行该查询。

  5. 获取并处理查询结果:使用 cursor.fetchall() 方法获取所有查询结果,然后遍历结果并打印每个部门中薪水最高的员工信息。

  6. 异常处理:使用 try - except 块捕获可能出现的数据库连接错误或查询执行错误,并打印错误信息。

  7. 关闭数据库连接:无论是否发生异常,最后都使用 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("数据库连接已关闭。")
        # 打印数据库连接已关闭的提示信息。

执行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值