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)}")