Python 操作 MySQL 数据库

文章目录

    • 一、概述
    • 二、基本连接与游标操作
      • [1. 数据库连接](#1. 数据库连接)
      • [2. 创建游标](#2. 创建游标)
    • 三、SQL语句执行方式
      • [1. 字符串拼接方式(不推荐)](#1. 字符串拼接方式(不推荐))
      • [2. 参数化查询方式(推荐)](#2. 参数化查询方式(推荐))
      • [3. 批量插入数据](#3. 批量插入数据)
    • 四、事务管理与结果获取
      • [1. 提交事务](#1. 提交事务)
      • [2. 结果集获取](#2. 结果集获取)
    • [五、使用 *with* (上下文管理器)优化代码](#五、使用 with (上下文管理器)优化代码)
      • [1. 文件读取与数据处理](#1. 文件读取与数据处理)
      • [2. 使用with语句自动管理资源](#2. 使用with语句自动管理资源)

一、概述

Python通过pymysql库可以方便地操作MySQL数据库,实现数据查询、插入、更新和删除等操作。pymysql是一个纯Python实现的MySQL客户端库,支持Python 3.x版本。

  • pymysql 库安装:pip install pymysql

二、基本连接与游标操作

1. 数据库连接

python 复制代码
import pymysql

# 建立数据库连接
connect = pymysql.connect(
    host="master",      # 数据库主机地址
    user="root",        # 数据库用户名
    password="123456",  # 数据库密码
    database="stu",     # 要使用的数据库名
    port=3306          # 端口号,MySQL默认3306
)

参数说明:

  • host: MySQL服务器地址,可以是IP或域名
  • user: 登录用户名
  • password: 登录密码
  • database: 要操作的数据库
  • port: 端口号,默认3306

2. 创建游标

python 复制代码
cursor = connect.cursor()
  • 游标用于执行SQL语句并获取结果,是数据库操作的核心对象。

三、SQL语句执行方式

1. 字符串拼接方式(不推荐)

python 复制代码
name = "zhouqi"
balance = 1500
ids = "20250101 OR 1=1"  # 存在SQL注入风险
stu_id = "20251001"

# 第一种写法:字符串直接拼接
query_sql = "select * from students where stu_id = " + f"{ids}"
# 或使用格式化字符串
# query_sql = "select * from students where stu_id = %s" % ids

print(query_sql)  # 输出:select * from students where stu_id = 20250101 OR 1=1
cursor.execute(query_sql)

注意 :这种方式存在SQL注入风险,当用户输入包含SQL语句时(如OR 1=1),可能导致数据泄露。

2. 参数化查询方式(推荐)

python 复制代码
# 第二种写法:使用参数化查询
query_sql = "insert into account values(0,%s,%s)"
print(query_sql)  # 输出:insert into account values(0,%s,%s)
cursor.execute(query_sql, (name, balance))

优势:

  • 防止SQL注入攻击
  • 自动处理数据类型转换
  • 提高代码可读性

3. 批量插入数据

python 复制代码
# 一次性插入多条数据
name_list = [("liuba", 2000), ("hongjiu", 3000)]
cursor.executemany(query_sql, name_list)
  • executemany()方法可以高效地批量执行相同的SQL语句,参数为元组列表(即使参数为一个也需要使用元组)。

四、事务管理与结果获取

1. 提交事务

python 复制代码
# 提交事务,将更改更新到表
connect.commit()

注意 :对于INSERT、UPDATE、DELETE等修改操作,必须调用commit()才会生效。

2. 结果集获取

python 复制代码
# 获取单条记录
cursor.execute("SELECT * FROM students")
print(cursor.fetchone())  # 获取第一条记录
print("*" * 50)

# 获取所有记录
print(cursor.fetchall())  # 获取所有记录
print("*" * 50)

# 获取指定数量的记录
print(cursor.fetchmany(10))  # 获取10条记录

方法:

  • fetchone(): 获取下一行记录
  • fetchall(): 获取所有剩余记录
  • fetchmany(size): 获取指定数量的记录,为-1时获取全部记录

五、使用 with (上下文管理器)优化代码

1. 文件读取与数据处理

python 复制代码
import pymysql

with open(r"D:\Desktop\mysqlmd\第四天\socres.txt", "r", encoding="utf-8") as fp:
    line_list = fp.readlines()

print(line_list)
tuple_list = []
for line in line_list:
    li = line.strip().split(",")
    tuple_list.append((int(li[0]), int(li[1]), int(li[2]), str(li[3])))

print(tuple_list)

2. 使用with语句自动管理资源

python 复制代码
# with语句自动管理连接和游标的关闭
with pymysql.connect(
        host="master", user="root", password="123456", database="stu", port=3306) as connnet:
    with connnet.cursor() as cursor:
        insert_sql = "insert into score values(%s,%s,%s,%s)"
        try:
            cursor.executemany(insert_sql, tuple_list)
        except Exception as e:
            print(e)
            connnet.rollback()  # 发生异常时回滚事务
        else:
            connnet.commit()    # 正常执行时提交事务

优势:

  • 自动关闭连接和游标,避免资源泄漏
  • 代码结构更清晰
相关推荐
这个DBA有点耶3 小时前
2026年分布式数据库有哪些主流选择?先评估这5个维度再决定
数据库·分布式·dba
用户7783366132114 小时前
用 React Hook 封装搜索数据:useSerp 的防抖、缓存与错误处理
python·api
这个DBA有点耶5 小时前
从MySQL 5.7到8.0:JSON查询性能差在哪?虚拟列索引vs多值索引怎么选
数据库·mysql·架构
胡写代码5 小时前
数据库审计字段,别再每张表各写一套了——我统一成这 6 个字段
数据库
65岁退休Coder8 小时前
LangGraph v1.2.9 节点容错策略 & 流式输出 & 持久化记忆管理
后端·python·langchain
SelectDB10 小时前
为什么 JSON 正在成为分析数据库新的竞争点?
数据库·json·agent
ClouGence10 小时前
开源数据库管理工具 CloudDM 4.2.0 发布,新增 GoldenDB、KingbaseES 等数据源
数据库·dba·devops
发霉的馒头11 小时前
ORA-00845: MEMORY_TARGET not supported on this system的解决方法
数据库
ikun_文11 小时前
Django框架路由Router的使用
python·pycharm·django
IvanCodes11 小时前
Python 基础语法(二):字符串与常用操作
python