使用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)}")
相关推荐
数据库小组32 分钟前
2026 年,MySQL 到 SelectDB 同步为何更关注实时、可观测与可校验?
数据库·mysql·数据库管理工具·数据同步·ninedata·selectdb·迁移工具
华科易迅35 分钟前
MybatisPlus增删改查操作
android·java·数据库
Kethy__1 小时前
计算机中级-数据库系统工程师-计算机体系结构与存储系统
大数据·数据库·数据库系统工程师·计算机中级
SHoM SSER1 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql
熬夜的咕噜猫1 小时前
MySQL备份与恢复
数据库·oracle
IAUTOMOBILE2 小时前
Python 流程控制与函数定义:从调试现场到工程实践
java·前端·python
jnrjian2 小时前
recover database using backup controlfile until cancel 假recover,真一致
数据库·oracle
qq_283720052 小时前
MySQL技巧(十四): 连接数过多 (Too many connections):原因 + 排查 + 终极解决方案
mysql·连接池·性能·异常
lifewange2 小时前
java连接Mysql数据库
java·数据库·mysql
大妮哟3 小时前
postgresql数据库日志量异常原因排查
数据库·postgresql·oracle