本章节讲解Python操做数据库,完成简单的增删改查工做,以MySQL数据库为例。python
Python的MySQL数据库操做模块叫MySQLdb,须要额外的安装下。sql
经过pip工具安装:pip install MySQLdb数据库
MySQLdb模块,咱们主要就用到链接数据库的方法MySQLdb.Connect(),链接上数据库后,再使用一些方法作相应的操做。运维
MySQLdb.Connect(parameters...)方法提供了如下一些经常使用的参数:ide
参数函数 |
描述工具 |
host | 数据库地址 |
user | 数据库用户名, |
passwd | 数据库密码,默认为空 |
db | 数据库库名,没有默认库 |
port | 数据库端口,默认3306 |
connect_timeout | 链接超时时间,秒为单位 |
use_unicode | 结果以unicode字符串返回 |
charset | 插入数据库编码 |
链接对象返回的connect()函数:fetch
commit() | 提交事务。对支持事务的数据库和表,若是提交修改操做,不适用这个方法,则不会写到数据库中 |
rollback() | 事务回滚。对支持事务的数据库和表,若是执行此方法,则回滚当前事务。在没有commit()前提下。 |
cursor([cursorclass]) | 建立一个游标对象。全部的sql语句的执行都要在游标对象下进行。MySQL自己不支持游标,MySQLdb模块对其游标进行了仿真。 |
游标对象也提供了几种方法:编码
close() | 关闭游标 |
execute(sql) | 执行sql语句 |
excutemany(sql) | 执行多条sql语句 |
fetchone() | 从执行结果中取第一条记录 |
fetchmany(n) | 从执行结果中取n条记录 |
fetchall() | 从执行结果中取全部记录 |
scroll(self, value, mode='relative') | 游标滚动 |
博客地址:http://lizhenliang.blog.51cto.comspa
QQ群:323779636(Shell/Python运维开发群)
13.1 数据库增删改查
13.1.1 在test库建立一张user表,并添加一条记录
>>> conn = MySQLdb.Connect(host='192.168.1.244',user='root',passwd='QHyCTajI',db='test',charset='utf8') >>> cursor = conn.cursor() >>> sql = "create table user(id int,name varchar(30),password varchar(30))" >>> cursor.execute(sql) # 返回的数字是影响的行数 0L >>> sql = "insert into user(id,name,password) values('1','xiaoming','123456')" >>> cursor.execute(sql) 1L >>> conn.commit() # 提交事务,写入到数据库 >>> cursor.execute('show tables') # 查看建立的表 1L >>> cursor.fetchall() # 返回上一个游标执行的全部结果,默认是以元组形式返回 ((u'user',),) >>> cursor.execute('select * from user') 1L >>> cursor.fetchall() ((1L, u'xiaoming', u'123456'),)
13.1.2 插入多条数据
>>> sql = 'insert into user(id,name,password) values(%s,%s,%s)' >>> args = [('2','zhangsan','123456'), ('3','lisi','123456'),('4','wangwu','123456')] >>> cursor.executemany(sql, args) 3L >>> conn.commit() >>> sql = 'select * from user' >>> cursor.execute(sql) 4L >>> cursor.fetchall() ((1L, u'xiaoming', u'123456'), (2L, u'zhangsan', u'123456'), (3L, u'lisi', u'123456'), (4L, u'wangwu', u'123456'))
args变量是一个包含多元组的列表,每一个元组对应着每条记录。当查询多条记录时,使用此方法,可有效提升插入效率。
13.1.3 删除用户名xiaoming的记录
>>> sql = 'delete from user where name="xiaoming"' >>> cursor.execute(sql) 1L >>> conn.commit() >>> sql = 'select * from user' >>> cursor.execute(sql) 3L >>> cursor.fetchall() ((2L, u'zhangsan', u'123456'), (3L, u'lisi', u'123456'), (4L, u'wangwu', u'123456'))
13.1.4 查询记录
>>> sql = 'select * from user' >>> cursor.execute(sql) 3L >>> cursor.fetchone() # 获取第一条记录 (2L, u'zhangsan', u'123456') >>> sql = 'select * from user' >>> cursor.execute(sql) 3L >>> cursor.fetchmany(2) # 获取两条记录 ((2L, u'zhangsan', u'123456'), (3L, u'lisi', u'123456'))
13.1.4 以字典形式返回结果
默认显示是元组形式,要想返回字典形式,使得更易处理,就用到cursor([cursorclass])中的cusorclass参数。
传入MySQLdb.cursors.DictCursor类:
>>> cursor = conn.cursor(MySQLdb.cursors.DictCursor) >>> sql = 'select * from user' >>> cursor.execute(sql) 3L >>> cursor.fetchall() ({'password': u'123456', 'id': 2L, 'name': u'zhangsan'}, {'password': u'123456', 'id': 3L, 'name': u'lisi'}, {'password': u'123456', 'id': 4L, 'name': u'wangwu'})
13.2 遍历查询结果
#!/usr/bin/env python # -*- coding: utf-8 -*- import MySQLdb try: conn = MySQLdb.Connect(host='127.0.0.1', port=3306, user='root', passwd='123456', connect_timeout=3, charset='utf8') cursor = conn.cursor() sql = "select * from user" cursor.execute(sql) for i in cursor.fetchall(): print i except Exception, e: print ("Connection Error: " + str(e)) finally: conn.close() # python test.py (2L, u'zhangsan', u'123456') (3L, u'lisi', u'123456') (4L, u'wangwu', u'123456')
使用for循环遍历查询结果,并增长了异常处理。