Python操作MySQL基础:连接、建表与数据增删改查
本文详解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: 以上内容为学习笔记,难免存在疏漏,欢迎指正。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













