Python 使用 MySQLdb 连接并操作 MySQL 数据库实战指南
本文详细演示如何使用 Python 的 MySQLdb 模块连接 MySQL 数据库,并完成建表、单条插入、批量写入、数据更新及结果读取等核心操作。重点说明 charset 参数解决中文乱码的逻辑,强调 conn.commit() 提交事务的必要性,并附带常用光标方法的快速查阅指南。
Python 操作 MySQL 数据库的核心实现路径
第1步:初始化连接对象与基础环境搭建(准备条件)
在编写任何数据库操作前,首要任务是建立稳定连接并指定正确的字符集。通过 MySQLdb.connect() 传入主机地址、用户名、密码、目标数据库及端口,即可创建连接对象。为避免中文数据在客户端显示正常而在数据库中存储为乱码,必须在连接参数中显式声明与数据库一致的编码格式(如 utf8 或 gb2312)。
import MySQLdb
try:
# 建立连接并配置字符集,确保中文读写一致
conn = MySQLdb.connect(
host='localhost',
user='root',
passwd='root',
db='test',
port=3306,
charset='utf8'
)
cur = conn.cursor()
# 创建测试数据库与数据表
cur.execute('create database if not exists python')
conn.select_db('python')
cur.execute('create table test(id int, info varchar(20))')
print("数据库与表结构初始化完成")
except MySQLdb.Error as e:
print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
第2步:执行数据写入与事务提交(真实操作顺序)
数据修改操作必须通过事务机制落地。Python 连接默认处于自动提交关闭状态,所有 INSERT、UPDATE 或 DELETE 语句执行后,必须调用 conn.commit() 才能永久生效,否则回滚或断开连接会导致数据丢失。支持通过占位符 (%s) 传递安全参数,并使用 executemany() 提升批量写入效率。
import MySQLdb
try:
conn = MySQLdb.connect(host='localhost', user='root', passwd='root', port=3306, charset='utf8')
conn.select_db('python')
cur = conn.cursor()
# 1. 单条插入
value = (1, 'hi rollen')
cur.execute('insert into test values(%s,%s)', value)
# 2. 批量插入(循环构建元组列表)
values = []
for i in range(20):
values.append((i, 'hi rollen' + str(i)))
cur.executemany('insert into test values(%s,%s)', values)
# 3. 条件更新
cur.execute('update test set info="I am rollen" where id=3')
# ⚠️ 关键:务必提交事务,否则上述写入不会真正生效
conn.commit()
print("数据写入与更新事务已提交")
except MySQLdb.Error as e:
print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
finally:
cur.close()
conn.close()
第3步:运行查询语句并提取结果集(完成判断)
查询操作通过 cur.execute() 发送 SQL,返回受影响的行数。获取结果集依赖于光标对象的三个核心方法:fetchone() 读取首行,fetchmany(size) 按指定数量读取,fetchall() 拉取全部剩余数据。配合 cur.scroll(mode) 可灵活重置读取指针位置,便于重复遍历或定位特定记录。
import MySQLdb
try:
conn = MySQLdb.connect(host='localhost', user='root', passwd='root', port=3306, charset='utf8')
conn.select_db('python')
cur = conn.cursor()
count = cur.execute('select * from test')
print(f'当前表共有 {count} 条记录')
# 读取第一条
result = cur.fetchone()
print(f'首条记录 -> ID: {result[0]}, info: {result[1]}')
# 连续读取后续5条
results = cur.fetchmany(5)
for row in results:
print(row)
# 将指针移回结果集第一行(绝对模式)
cur.scroll(0, mode='absolute')
# 一次性获取全量数据
all_results = cur.fetchall()
for r in all_results:
print(r[1]) # 仅打印 info 字段
except MySQLdb.Error as e:
print("Mysql Error %d: %s" % (e.args[0], e.args[1]))
finally:
cur.close()
conn.close()
MySQLdb 核心方法速查参考
掌握以下光标与连接层 API 可覆盖绝大多数常规交互场景:
- 事务控制:
commit()提交当前事务;rollback()撤销未提交的修改,常用于异常捕获块中恢复状态。 - 执行命令:
-execute(query, args):执行含参数的单条 SQL,返回受影响行数。
-executemany(query, args_list):复用同一模板执行多组参数,显著提升批量导入性能。
-callproc(procname, args):调用数据库存储过程,返回影响行数。 - 结果接收:
-fetchone():每次提取下一行数据,耗尽返回None。
-fetchmany(size=None):最多取出 size 条记录,未指定则按cursor.arraysize默认值读取。
-fetchall():一次性加载剩余所有行至内存列表,适合中小规模数据集。 - 指针移动:
scroll(value, mode):mode 设为'relative'时基于当前行偏移,设为'absolute'时以结果集第一行为基准跳转。
总结
利用 Python 的 MySQLdb 驱动操作关系型数据库,关键在于理顺连接鉴权、参数化语句防注入、明确事务边界以及合理运用游标取值方法。只要规范书写 try...except...finally 上下文并在最后调用 conn.commit(),即可稳定完成各类数据流转任务。以上就是 Python 使用 MySQLdb 连接并操作 MySQL 数据库的详细内容,更多关于 Python 数据库开发与后端交互的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









