Python操作MySQL基础:连接、建表与数据增删改查

Hazel
Hazel
发布时间:2026-10-12 | 2人浏览过
原创

本文详解Python使用MySQLdb库操作MySQL数据库的完整流程,涵盖建立连接、获取游标、创建数据表及提交事务。重点对比了直接执行SQL与使用占位符%s的安全写入方式,并演示了executem批量操作及fetchall查询技巧,帮助开发者掌握安全高效的数据库交互方法。

前奏

为了在Python中操作数据库,首先需要确保环境中已安装MySQL服务,并创建一个名为python_test的测试数据库,供后续示例使用。

CREATE DATABASE `python_test` CHARSET UTF8

导入数据库模块

import MySQLdb

连接数据库

con = MySQLdb.connect(host="localhost", user="root", passwd="******",db="python_test",port=3306)

虽然通过Python获取了数据库连接对象,但该对象本身无法直接执行SQL命令。必须通过该连接获取游标(cursor)对象,才能进行后续的数据库操作。

cur = con.cursor()

创建表格

cur.execute('create table stu_info (name char(128) not null default "", age tinyint(3) not null default 0, sex enum("man","femal") not null default "man") engine=innodb charset=utf8')
#0L

调用cur.execute执行建表语句后,返回值为受影响的行数。由于建表操作不修改现有数据,因此返回值为0L。

此时SQL语句仅在游标中准备,并未真正生效。必须调用MySQLdb.commit()方法提交事务,才能确保建表操作真正执行完毕。

con.commit()

至此,数据表才算真正创建完成。

向表中写入数据的流程与建表类似,同样遵循先execute执行SQL,再commit提交事务的步骤。

不过,写入数据时的execute方法调用略有不同,具体见下文更新表数据的示例。

向表中插入数据时,执行execute方法主要有两种方式:第一种是直接构造完整的SQL字符串传入execute(sql),随后调用commit完成写入。

cur.execute("insert into stu_info (name, age, sex) values ('Yi_Zhi_Yu',25,'man')")
con.commit()

这种方式虽能直接写入数据,但存在另一种更推荐的做法:execute方法可接受两个参数。第一个参数为包含占位符%s的SQL语句,第二个参数为实际的数值列表,示例如下。

cur.execute("insert into stu_info (name, age, sex) values (%s,%s,%s)", ("Tony",25, "man"))
con.commit()

相较于第一种方式,这种使用占位符%s的方法代码结构更清晰,且能有效防止SQL注入攻击,安全性更高。

此外,游标对象还提供executemany方法,其参数格式与execute相同,但第二个参数可传入多组数据列表,从而实现批量执行同一SQL语句的效果。

cur.executemany("insert into stu_info (name, age, sex) values (%s,%s,%s)",(("LiMei",26,"femal"),("YuanYuan",28,"femal")))
con.commit()

上述代码实际上执行了两次插入操作。接下来介绍数据查询部分。

直接参考以下示例代码。

cur.execute("select * from stu_info")
stus = cur.fetchall() 

#stus变量已包含查询结果集,其数据结构如下。

(('Yi_Zhi_Yu', 25, 'man'),
 ('Tony', 25, 'man'),
 ('LiMei', 26, 'femal'),
 ('YuanYuan', 28, 'femal'))

结果以元组(tuple)形式存储,我们可以通过循环遍历输出每条记录。

 for stu in stus:
    print "name: %s; age: %d; sex: %s" %(stu[0], stu[1], stu[2])

输出结果如下。

name: Yi_Zhi_Yu; age: 25; sex: man
name: Tony; age: 25; sex: man
name: LiMei; age: 26; sex: femal
name: YuanYuan; age: 28; sex: femal

上述查询虽能获取每行数据,但结果集中未包含字段名。若需返回包含字段名的结果集,可进行如下操作。

cur = con.cursor(cursorclass=MySQLdb.cursors.DictCursor)
cur.execute("select * from stu_info")
cur.fetchall()

返回的结果集格式如下。

({'age': 25, 'name': 'Yi_Zhi_Yu', 'sex': 'man'},
 {'age': 25, 'name': 'Tony', 'sex': 'man'},
 {'age': 26, 'name': 'LiMei', 'sex': 'femal'},
 {'age': 28, 'name': 'YuanYuan', 'sex': 'femal'})

此时,结果集中的每个元素均为字典(dict),以键值对(key-value)的形式展示字段名及其对应的值。

总结:在Python中对MySQL数据进行增、删、改操作时,需先通过游标对象执行SQL语句,再使用连接对象的commit方法提交事务;查询操作的结果则通过游标对象的fetch系列方法获取。

PS: 以上内容为学习笔记,难免存在疏漏,欢迎指正。

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表