浅谈Python访问MySQL的正确姿势
Py2时代,访问MySQL数据库的模块除了PyMySQL和MySQL-python之外,还有以速度见长的Umysql,以及非常小众的Oursql模块。进入了Py3时代之后,PyMySQL与时俱进,顺利升级到Py3版本,MySQL-python则被它的一个Py3分支——mysqlclient取代,而Umysql和Oursql则停留在了属于它们的那个时代。
下表给出了PyMySQL模块和mysqlclient模块在安装方式、导入方式、支持的Python版本和数据库版本等方面的比较。因为缺少可信的资料,这里没有对两个模块的性能做出比较。不过,PyMySQL明确声明支持最新的MySQL和MariaDB,而mysqlclient关于数据库版本支持的描述显得模棱两可、似是而非,所以很多人也许会把PyMySQL作为首选。但从我们的实际应用来看,mysqlclient并没有受到过数据库版本的限制。我更愿意把版本支持的表述解读为两个开发团队风格不同所致。
有趣的是,不管是PyMySQL,还是MySQL-python,或者后来取而代之的mysqlclient,它们在用法上几乎完全一致:都是基于PythondatabaseAPIversion2.0,这个标准也被称作PEP-0249。这意味着,我们不用修改代码,就可以更换数据库客户端。下面的应用实例证明了这一点:除了模块名字不一样,其余代码完全一致。
姿势1:以元组形式返回查询记录
我们以PyMySQL模块为例,先来看看最常见的用法:以元组形式返回查询记录。如果把代码中的pymysql改为MySQLdb,可以轻松切换成mysqlclient模块。
>>>importpymysql >>>db=pymysql.connect( host='localhost', user='xufive', password='********', db='demo', charset='utf8' ) >>>cursor=db.cursor() >>>cursor.execute('select*frommemberwhereid=%s',(100,)) 1 >>>print(cursor.fetchall()) ((100,'370103********0012','*9EE8E3304D69C3E9260F19C224EA5852129BF030','王茁洋','男',datetime.date(****,**,**),'','济南','济南泉景小学','186********',Decimal('1812.50')),) >>>cursor.close() >>>db.close()
姿势2:以字典形式返回查询记录
查询结果以元组形式返回,有很多不便,我们需要知道元组各元素对应的是表结构中的哪一个字段(列)。下面的代码,实现了以字典形式返回查询记录。同样的,如果把代码中的MySQLdb改为pymysql,可以轻松切换成PyMySQL模块。
>>>importMySQLdb.cursors >>>db=MySQLdb.connect( host='localhost', user='xufive', password='********', db='demo', charset='utf8', cursorclass=MySQLdb.cursors.DictCursor ) >>>withdb.cursor()ascursor: sql='select*frommemberwhereid=%s' cursor.execute(sql,(100,)) print(cursor.fetchall()) 1 ({'id':100,'idcard':'370103********0012','passwd':'*9EE8E3304D69C3E9260F19C224EA5852129BF030','name':'王茁洋','sex':'男','birthday':datetime.date(****,**,**),'title':'','address':'济南','club':'济南泉景小学','phone':'186********','rating':Decimal('1812.50')},)
姿势3:事务回滚
事务是关系型数据库的重要特性,NoSQL数据库、分布式数据库通常会淡化、甚至放弃事务。所谓事务是将一组DML(insert、update、delete)语句组合在一起形成一个逻辑单元,这些操作要么全部执行成功提交(commit),如果不成功就要回退到事务开始之前的状态(rollback),以确保不会停留在错误的中间状态。下面的代码演示了MySQL典型的事务回滚应用。
>>>importpymysql >>>db=pymysql.connect( host='localhost', user='xufive', password='********', db='demo', charset='utf8' ) deftransaction(db): try: db.begin() #此处加入出错之后需要回滚的DML(insert、update、delete)语句 db.commit() returnTrue except: db.rollback() returnFalse
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。