用python操作mysql数据库,就会用到MySQLdb模块,这个模块其实和文件数据库SQLite的操作方式一样的
先来看一下这模块的简单实用
插入数据
import MySQLdb #创建一个mysql的连接对象 conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='1234',db='mydb') #创建操作游标,一切对数据库的操作都是调用游标里的方法 cur = conn.cursor() """ 这里要注意,和其他模块不同的就是value里面参数的占位符,在mysql里面不管要value的值是什么类型,占位符只有%s一种模式。这要切记~~!! """ reCount =cur.execute('insert into UserInfo(Name,age) values(%s,%s)',('alex',18)) #执行插入语句会返回成功插入的条目数。可以将这个条目数打印出来 print reCount conn.commit() cur.close() conn.close()
这段代码有点数据库基础的的就可以看懂,其实就是在cur.execute()方法的括号里写入要执行的sql语句就好了。
如果有多条语句需要插入,最简单的使用for循环的方式插入数据。但是模块自带了executemany方法可以更加方便的实现多条语句同时插入的功能
import MySQLdb conn = MySQLdb.connect(host='127.0.0.1',user='root',passwd='1234',db='mydb') cur = conn.cursor() #以元组为单位,存入要插入的values值 li =[ ('alex','usa'), ('sb','usa'), ] #这里改成调用executemany()方法一次操作多条数据 reCount = cur.executemany('insert into UserInfo(Name,Address) values(%s,%s)',li) conn.commit() cur.close() conn.close() print reCount
查询操作是我们最常用的数据库操作,模块也为我们提供了很多选项
查询操作
import MySQLdb conn = MySQLdb.connect(host='192.168.10.105',user='wgw',passwd='123456',db='wgwtest') cur = conn.cursor() reCount = cur.execute('select * from user_list') #通过fetchone方法获取一条结果 print cur.fetchone() print 'select %s lins'%reCount
上面的代码执行结果是
(1L, 1L, 'wgw', '123456', 0L) select 3 lins
返回的统计结果是查询到了3条数据,我们只获得了一条。这是怎么回事?这是因为我们使用了fetchone方法。这个方法不管查询了多少条数据,它只取第一条。另外我们看到查询结果里面的有很多的L,这个L是表示我们查询出来的数字类型是Long int 长整形的。
那如果我们要获取所有的查询结果怎么办呢?那就用fetchall()方法
#!/usr/bin/env python # -*-coding:utf-8-*- import MySQLdb conn = MySQLdb.connect(host='192.168.10.105',user='wgw',passwd='123456',db='wgwtest') cur = conn.cursor() reCount = cur.execute('select * from user_list') #通过fetchall方法获取全部结果 print cur.fetchall() print 'select %s lins'%reCount
这次的执行结果如下
((1L, 1L, 'wgw', '123456', 0L), (2L, 2L, 'alex', '123456', 1L), (3L, 3L, 'eric', '123456', 0L)) select 3 lins
这样就查询出来了所有数据条目,fetchall的运行结果是用一个大的元组包含了所有的数据条目,其中每一个数据条目都用一个小元组表示。但是这种元组套元组的方式也很麻烦。比如我们要取用户名的字段值,那需要对元组的内容进行切片,先切大的再切小的。是不是很麻烦?这个我们也有办法解决。问题就是处在游标对象身上
我们创建游标的对象的时候用的语句是
cur = conn.cursor()
这种模式,默认获取的结果都以元组形式展现。我们现在换一种创建对象的方法
cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor)
这种方式指定了游标以字典的形式返回数据,我们来看看效果。
先看看fetchone
#!/usr/bin/env python # -*-coding:utf-8-*- import MySQLdb conn = MySQLdb.connect(host='192.168.10.105',user='wgw',passwd='123456',db='wgwtest') #cur = conn.cursor() #指定游标的数据返回类型 cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) reCount = cur.execute('select * from user_list') #通过fetchall方法获取全部结果 print cur.fetchall() print 'select %s lines'%reCount
运行结果如下
{'tid': 1L, 'passwd': '123456', 'login_count': 0L, 'uid': 1L, 'name': 'wgw'} select 3 lines
返回的查询结果变成字典形式了,字典的key就是字段名称,value就是我们查询的字段值。这样我们通过fetchone['name']这可以获得用户名。别切片方式省事多了
再看看fetchall的效果
#!/usr/bin/env python # -*-coding:utf-8-*- import MySQLdb conn = MySQLdb.connect(host='192.168.10.105',user='wgw',passwd='123456',db='wgwtest') #cur = conn.cursor() #指定游标的数据返回类型 cur = conn.cursor(cursorclass = MySQLdb.cursors.DictCursor) reCount = cur.execute('select * from user_list') #通过fetchall方法获取全部结果 print cur.fetchall() print 'select %s lines'%reCount
运行结果如下:
({'tid': 1L, 'passwd': '123456', 'login_count': 0L, 'uid': 1L, 'name': 'wgw'}, {'tid': 2L, 'passwd': '123456', 'login_count': 1L, 'uid': 2L, 'name': 'alex'}, {'tid': 3L, 'passwd': '123456', 'login_count': 0L, 'uid': 3L, 'name': 'eric'}) select 3 lines
看结果每个数据条目的内容已经用字典表示了,但是fetchall()方法还是会在结果最外层加个元组封装。这是没办法的事情了,但那也比最原始的模式要好操作的多。
使用MySQLdb模块,个人的感觉就3点
1、游标的获取类型指定为字典类型
2、如果查询结果只有一条就用fetchone()方法,这样可以少处理一层元组
3、好好学学数据库SQL语言,这个模块的核心还是调用数据库的SQL实现的。SQL写的不行其他的都白瞎了
本文出自 “霹雳豆包” 博客,谢绝转载!