课题-Python-MySQLdb-学习总结

上传人:回**** 文档编号:120879622 上传时间:2022-07-18 格式:DOCX 页数:7 大小:26.19KB
返回 下载 相关 举报
课题-Python-MySQLdb-学习总结_第1页
第1页 / 共7页
课题-Python-MySQLdb-学习总结_第2页
第2页 / 共7页
课题-Python-MySQLdb-学习总结_第3页
第3页 / 共7页
点击查看更多>>
资源描述
Python MySQLdb 学习总结任何应用都离不开数据,因此在学习python的时候,固然也要学习一种如何用python操作数据库了。MySQLdb就是python对mysql数据库操作的模块。官方Introduction :MySQLdb is an thread-compatible interface to the popular MySQLdatabase server that provides the Python database API. 它其实相称于翻译了相应C的接口。 使用这种数据库接口大多是就是执行连接数据库-执行query-提取数据-关闭连接 这几种环节。MySQLdb提供比较核心的对象,分别是Connection、Cursor、Result。具体使用环节很简朴先不写了,先写某些个人觉得比较重要、值得注意的地方。1、虽然在MySQLdb.Connect(host ,user , passw , db)函数中,我们常常使用的只是这几种参数,但是其实里面尚有诸多例如字符集、线程安全、ssl等也都是很重要的参数,使用时要身份注意。2、当使用Connection.query()函数进行query后,connection 对象可以返回两种result,分别是store_result和use_result,store_result 将成果集存回client端,而use_result则是成果集保存在server端,并且维护了一种连接,会占用server资源。此时,不可以进行任何其她的查询。建议使用store_result,除非返回成果集(result set)过大或是无法使用limit的情形。3、提取(fetch)数据的返回形式大多有三种情形。as a tuple(how=0) ;as dictionaries, key=column or table.column if duplicated(how=1);as dictionaries, key=table.column (how=2)4、每次fetch,在result内部都会产生数据位置的移动,也就是说如果有10行数据,执行result.fetch_row(3,0),会得到前三行,再执行result.fetch_row(3,0),则会得到中间的三行,因此说fetch会导致position的移动。此外值得注意的是,如果使用use_result,也就是数据存储在server时,在fetch所有的条目之前,不能进行任何的query操作。5、mysql自身不支持游标(Cursor),但是MySQLdb对Cursor进行了仿真。重要的执行query措施有execute 和 executemany 。execute措施,执行单条sql语句,调用executemany措施较好用,数据库性能瓶颈很大一部分就在于网络IO和磁盘IO将多种insert放在一起,只执行一次IO,可以有效的提高数据库性能。游标cursor具有fetchone、fetchmany、fetchall三个措施提取数据,每个措施都会导致游标游动,因此必须关注游标的位置。游标的scroll(value, mode)措施可以使得游标进行卷动,mode参数指定相对目前位置(relative)还是以绝对位置(absolute)进行移动。6、MySQLdb提供了诸多函数措施,在官方指南里没有完全罗列,使用者可以用help去看看,里面提供了诸多以便的东西。7、对于mysql来说,如果使用支持事务的存储引擎,那么每次操作后,commit是必须的,否则不会真正写入数据库,相应rollback可以进行相应的回滚,但是commit后是无法再rollback的。commit() 可以在执行诸多sql指令后再一次调用,这样可以合适提高性能。8、executemany解决过多的命令也不见得一定好,由于数据一起传入到server端,也许会导致server端的buffer溢出,而一次数据量过大,也有也许产生某些意想不到的麻烦。合理,分批次executemany是个不错的措施。最后,我自己写了个pyMysql模块,重要是对MySQLdb提供的常用措施进行了简朴的再次封装,也借此机会好好学习下MySQLdb,以及练习python的编码。该程序使用的数据库表,采用myisam引擎,因此没加上commit(),一般最佳还是要加上的。代码如下:PyMysql.py?#-*- encoding:gb2312 -*-_Created on -1-12author: xiaojayimport MySQLdbimport MySQLdb.cursorsSTORE_RESULT_MODE = 0USE_RESULT_MODE = 1CURSOR_MODE = 0DICTCURSOR_MODE = 1SSCURSOR_MODE = 2SSDICTCURSOR_MODE = 3FETCH_ONE = 0FETCH_MANY = 1FETCH_ALL = 2class PyMysql:def _init_(self):self.conn = Nonepassdef newConnection(self,host,user,passwd,defaultdb):建立一种新连接,指定host、顾客名、密码、默认数据库self.conn = MySQLdb.Connect(host,user,passwd,defaultdb)if self.conn.open = False:raise Nonedef closeConnnection(self):关闭目前连接self.conn.close()def query(self,sqltext,mode=STORE_RESULT_MODE):作用:使用connection对象的query措施,并返回一种元组(影响行数(int),成果集(result)参数:sqltext:sql语句mode=STORE_RESULT_MODE(0) 表达返回store_result,mode=USESTORE_RESULT_MODE(1) 表达返回use_result返回:元组(影响行数(int),成果集(result)if self.conn=None or self.conn.open=False :return -1self.conn.query(sqltext)if mode = 0 :result = self.conn.store_result() elif mode = 1 :result = self.conn.use_result()else :raise Exception(mode value is wrong.)return (self.conn.affected_rows(),result)def fetch_queryresult(self,result,maxrows=1,how=0,moreinfo=False):参数:result: query后的成果集合maxrows: 返回的最大行数how: 以何种方式存储成果(0:tuple,1:dictionaries with columnname,2:dictionaries with table.columnname)moreinfo 表达与否获取更多额外信息(num_fields,num_rows,num_fields)返回:元组(数据集,附加信息(当moreinfo=False)或单一数据集(当moreinfo=True)if result = None : return Nonedataset = result.fetch_row(maxrows,how)if moreinfo is False :return datasetelse :num_fields = result.num_fields()num_rows = result.num_rows()field_flags = result.field_flags()info = (num_fields,num_rows,field_flags)return (dataset,info)def execute(self,sqltext,args=None,mode=CURSOR_MODE,many=False):作用:使用游标(cursor)的execute 执行query参数:sqltext: 表达sql语句args: sqltext的参数mode:以何种方式返回数据集CURSOR_MODE = 0 :store_result , tupleDICTCURSOR_MODE = 1 : store_result , dictSSCURSOR_MODE = 2 : use_result , tupleSSDICTCURSOR_MODE = 3 : use_result , dict many:与否执行多行操作(executemany)返回:元组(影响行数(int),游标(Cursor)if mode = CURSOR_MODE :curclass = MySQLdb.cursors.Cursorelif mode = DICTCURSOR_MODE :curclass = MySQLdb.cursors.DictCursorelif mode = SSCURSOR_MODE :curclass = MySQLdb.cursors.SSCursorelif mode = SSDICTCURSOR_MODE :curclass = MySQLdb.cursors.SSDictCursorelse :raise Exception(mode value is wrong)cur = self.conn.cursor(cursorclass=curclass)line = 0if many = False :if args = None : line = cur.execute(sqltext)else :line = cur.execute(sqltext,args)else :if args = None :line = cur.executemany(sqltext)else :line = cur.executemany(sqltext,args)return (line , cur )def fetch_executeresult(self,cursor,mode=FETCH_ONE,rows=1):作用:提取cursor获取的数据集参数:cursor:游标mode:执行提取模式FETCH_ONE: 提取一种; FETCH_MANY :提取rows个 ;FETCH_ALL : 提取所有rows:提取行数返回:fetch数据集if cursor = None : returnif mode = FETCH_ONE :return cursor.fetchone()elif mode = FETCH_MANY :return cursor.fetchmany(rows)elif mode = FETCH_ALL :return cursor.fetchall()if _name_=_main_ :print help (PyMysql)测试代码:?#-*- encoding:gb2312 -*-import PyMysqlauthors 这张表很简朴。+-+-+-+-+-+-+| Field | Type | Null | Key | Default | Extra |+-+-+-+-+-+-+| author_id | int(11) | NO | PRI | NULL | auto_increment | author_last | varchar(50) | YES | | NULL | | author_first | varchar(50) | YES | MUL | NULL | | country | varchar(50) | YES | | NULL | |+-+-+-+-+-+-+本文重要的所有操作都针对该表。def printAuthors(res,mode=0,lines=0):格式化输出print *20, lines: ,lines , ,*20if mode=0 :for author_id , author_last , author_first , country in res :print ID : %s , Author_last : %s , Author_First : %s , Country : %s % (author_id , author_last , author_first , country )else :for item in res :print -for key in item.keys():print key , : ,itemkey#建立连接mysql = PyMysql.PyMysql()mysql.newConnection(host=localhost, user=root, passwd=peterbbs, defaultdb=bookstore)#定义sql语句sqltext = select * from authors order by author_id #调用query措施,得到resultlines , res = mysql.query(sqltext, mode=PyMysql.STORE_RESULT_MODE)#提取数据data = mysql.fetch_queryresult(res, maxrows=20, how=0, moreinfo=False)#打印printAuthors(data,0,lines)#演示多行插入sqltext = insert into authors (author_last,author_first,country) values (%s,%s,%s)args = (aaaaaa,bbbbbb,cccccc),(dddddd,eeeeee,ffffff),(gggggg,hhhhhh,iiiiii)lines ,cur = mysql.execute(sqltext,args,mode=PyMysql.DICTCURSOR_MODE,many=True)print *20, lines ,行被插入 ,*20sqltext = select * from authors order by author_id #调用cursor.execute措施,得到resultlines ,cur = mysql.execute(sqltext,mode=PyMysql.DICTCURSOR_MODE)#提取数据data = mysql.fetch_executeresult(cur, mode=PyMysql.FETCH_MANY, rows=20)#打印printAuthors(data,1,lines)#关闭连接mysql.closeConnnection()测试输出:* lines: 5 *ID : 1 , Author_last : Greene , Author_First : Graham , Country : United KingdomID : 4 , Author_last : Peter , Author_First : David , Country : ChinaID : 5 , Author_last : mayday , Author_First : Feng , Country : FranceID : 6 , Author_last : zhang , Author_First : lixin , Country : FranceID : 9 , Author_last : zhang111 , Author_First : lixin , Country : France* 3 行被插入 * lines: 8 *-country : United Kingdomauthor_id : 1author_first : Grahamauthor_last : Greene-country : Chinaauthor_id : 4author_first : Davidauthor_last : Peter-country : Franceauthor_id : 5author_first : Fengauthor_last : mayday-country : Franceauthor_id : 6author_first : lixinauthor_last : zhang-country : Franceauthor_id : 9author_first : lixinauthor_last : zhang111-country : ccccccauthor_id : 53author_first : bbbbbbauthor_last : aaaaaa-country : ffffffauthor_id : 54author_first : eeeeeeauthor_last : dddddd-country : iiiiiiauthor_id : 55author_first : hhhhhhauthor_last : gggggg
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 各类标准


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!