使用Python连接MySQL数据库

1.环境说明

Python版本:3.11.7

pymysql版本:1.0.2

MySQL数据库版本:5.7.38(64位版本)

数据库连接工具:HeidiSQL(版本号:12.12.0.7122)

数据库名称:DB_test

2.连接数据库

(1)构造连接参数

使用db_config记录连接参数。

db_config为字典格式,其中每个元素的键(key)表示参数名称,值(value)表示对应参数设置的值。

python 复制代码
db_config = {
    "host": "localhost",  # 服务器地址
    "port": 3306,  # 端口
    "user": "root",  # 用户名
    "password": "12345678",  # 密码
    "db": "DB_test",  # 数据库名称
    "charset": "utf8mb4"  # 字符集
    }

(2)连接数据库

使用pymysql.connect函数连接数据库:

python 复制代码
conn = pymysql.connect(**db_config)

其中**db_config表示对db_config进行拆包,将字典拆为关键字参数。

(3)判断连接是否成功

使用conn.open判断连接状态。

python 复制代码
if conn.open:
    print("数据库连接成功")
else:
    print("数据库连接失败")

(4)关闭数据库连接

python 复制代码
conn.close()

(5)完整代码

python 复制代码
import pymysql

db_config = {
    "host": "localhost",  # 服务器地址
    "port": 3306,  # 端口
    "user": "root",  # 用户名
    "password": "1qaz2wsx",  # 密码
    "db": "DB_test",  # 数据库名称
    "charset": "utf8mb4"  # 字符集
    }

try:
    # 连接数据库
    conn = pymysql.connect(**db_config)

    #判断是否连接成功
    if conn.open:
        print("数据库连接成功")
    else:
        print("数据库连接失败")
    
    # 关闭数据库
    conn.close()

except Exception as e:
    # 抛出异常
    print("错误", f"连接失败:{str(e)}")

3.读取数据

(1)数据说明

数据表stu如下图所示,共有4个字段(stuid、stuname、sturemark、stunumber),每个字段的值均为varchar格式。表中共有6条数据。

(2)读取数据

使用conn.cursor()方法创建游标cursor;

向该游标传入要执行的SQL语句(sql)并执行,此时将查询数据的请求保存在游标cursor中;

使用cursor.fetchall()方法查询数据并全部读出,保存在data中。

最后将data中的数据逐条显示。

python 复制代码
conn = pymysql.connect(**db_config)  # 连接数据库

sql = "SELECT stuid, stuname, sturemark, stunumber FROM stu"  # 查询数据所使用的SQL语句
cursor = conn.cursor()  # 创建游标
cursor.execute(sql)  # 查询数据
data = cursor.fetchall()  # 获取所有结果

for row_idx, (stuid, stuname, sturemark, stunumber) in enumerate(data):
    print(f"序号:{stuid},姓名:{stuname},备注:{sturemark},号码:{stunumber}")

cursor.close()  # 关闭游标
conn.close()  # 关闭数据库连接

这里的data为二重元组格式,元组中的每个元素也为一个元组,记录数据表中的一条数据。

data中不包含表头字段信息。

python 复制代码
data = (('0001', '霍华德', '魔术', '12'), ('0002', '詹姆斯', '骑士', '23'), ...)

最终显示的输出结果为:

python 复制代码
序号:0001,姓名:霍华德,备注:魔术,号码:12
序号:0002,姓名:詹姆斯,备注:骑士,号码:23
序号:0003,姓名:姚明,备注:火箭,号码:11
序号:0004,姓名:易建联,备注:雄鹿,号码:9
序号:0005,姓名:科比,备注:湖人,号码:24
序号:0006,姓名:杜兰特,备注:雷霆,号码:35

(3)逐条读取数据

当数据量较大的时候,为了节省内存占用,可以使用cursor.fetchone()方法,每次只读取表中的一条数据,当返回None时表示读取完毕。

则上述程序更改如下:

python 复制代码
conn = pymysql.connect(**db_config)  # 连接数据库
sql = "SELECT stuid, stuname, sturemark, stunumber FROM stu"  # 查询数据所使用的SQL语句
cursor = conn.cursor()  # 创建游标
cursor.execute(sql)  # 查询数据

while True:
    row = cursor.fetchone()  # 每次读取一条数据
    if row is None:
        break  # 读取完毕,退出循环
    stuid, stuname, sturemark, stunumber = row  # 将该条数据中各字段的值赋值给对应变量
    print(f"序号:{stuid}, 姓名:{stuname}, 备注:{sturemark}, 号码:{stunumber}")

cursor.close()  # 关闭游标
conn.close()  # 关闭数据库连接

最终输出结果与之前一次读取所有数据的输出结果一致:

bash 复制代码
序号:0001, 姓名:霍华德, 备注:魔术, 号码:12
序号:0002, 姓名:詹姆斯, 备注:骑士, 号码:23
序号:0003, 姓名:姚明, 备注:火箭, 号码:11
序号:0004, 姓名:易建联, 备注:雄鹿, 号码:9
序号:0005, 姓名:科比, 备注:湖人, 号码:24
序号:0006, 姓名:杜兰特, 备注:雷霆, 号码:35

4.完整代码

(1)一次读取所有数据

python 复制代码
import pymysql

db_config = {
    "host": "localhost",  # 服务器地址
    "port": 3306,  # 端口
    "user": "root",  # 用户名
    "password": "1qaz2wsx",  # 密码
    "db": "DB_test",  # 数据库名称
    "charset": "utf8mb4"  # 字符集
    }

try:
    conn = pymysql.connect(**db_config)  # 连接数据库
    sql = "SELECT stuid, stuname, sturemark, stunumber FROM stu"  # 查询数据所使用的SQL语句
    cursor = conn.cursor()  # 创建游标
    cursor.execute(sql)  # 查询数据
    data = cursor.fetchall()  # 获取所有结果
    for row_idx, (stuid, stuname, sturemark, stunumber) in enumerate(data):
        print(f"序号:{stuid},姓名:{stuname},备注:{sturemark},号码:{stunumber}")
    cursor.close()  # 关闭游标
    conn.close()  # 关闭数据库连接

except Exception as e:
    print("错误", f"连接失败:{str(e)}")

(2)逐条读取数据

python 复制代码
import pymysql

db_config = {
    "host": "localhost",  # 服务器地址
    "port": 3306,  # 端口
    "user": "root",  # 用户名
    "password": "1qaz2wsx",  # 密码
    "db": "DB_test",  # 数据库名称
    "charset": "utf8mb4"  # 字符集
    }

try:
    conn = pymysql.connect(**db_config)  # 连接数据库
    sql = "SELECT stuid, stuname, sturemark, stunumber FROM stu"  # 查询数据所使用的SQL语句
    cursor = conn.cursor()  # 创建游标
    cursor.execute(sql)  # 查询数据

    while True:
        row = cursor.fetchone()  # 每次读取一条数据
        if row is None:
            break  # 读取完毕,退出循环
        stuid, stuname, sturemark, stunumber = row  # 将该条数据中各字段的值赋值给对应变量
        print(f"序号:{stuid}, 姓名:{stuname}, 备注:{sturemark}, 号码:{stunumber}")

    cursor.close()  # 关闭游标
    conn.close()  # 关闭数据库连接

except Exception as e:
    print("错误", f"连接失败:{str(e)}")
相关推荐
吉甫作诵6 分钟前
Redis 常用命令大全:11 大类命令速查手册
运维·数据库·redis·缓存·nosql
2501_9336707910 分钟前
库存管理分析岗校招能力模型:SQL、库存周转、补货预测怎么准备
数据库
Ticnix34 分钟前
多租户 RAG:让每个用户只检索到自己的知识库
后端·python·agent
ID346107442037 分钟前
【课程设计】基于Spring Boot+Vue的游戏账号租赁系统的设计与实现-计算机毕设 附源码50345
javascript·vue.js·spring boot·python·node.js·php·课程设计
夏雪coding39 分钟前
RAG 要不要上向量库:720 个 chunk 用 numpy 点积就够了
python·aigc·ai编程
属于自己的天空1 小时前
不用再手动查表结构了:配好 MCP,Claude Code 自己读数据库生成代码
数据库·后端
Ticnix1 小时前
我删了 200 行 if-else,把决策逻辑全写进了 System Prompt
python·llm·agent
谢白羽1 小时前
在4×B300用SGLang部署DeepSeek-V4.1 Flash优化实录
笔记·python·llm·llama·sglang
Y3815326621 小时前
SERP 数据清洗实战:字段标准化、日期解析与去重键
开发语言·数据库·python·python数据库
苏苏susuus1 小时前
核密度估计(KDE)与高斯核(概念分享)
人工智能·python·ocr