浅谈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   mysqlclient               安装方式   pip安装PyMySQL   pip安装mysqlclient         导入方式   进口pymysql   进口MySQLdb         Python版本   2.7和祝辞=3.4   2.7和祝辞=3.4         数据库版本   MySQL祝辞=5.5
  MariaDB祝辞=5.5   MySQL版本从3.23到5.5;
  5.0或更新的建议。
  MariaDB也应该工作。            

  

有趣的是,不管是PyMySQL,还是MySQL-python,或者后来取而代之的mysqlclient,它们在用法上几乎完全一致:都是基于Python数据库API版本2.0,这个标准也被称作pep - 0249。这意味着,我们不用修改代码,就可以更换数据库客户端。下面的应用实例证明了这一点:除了模块名字不一样,其余代码完全一致。

  


  

  

我们以PyMySQL模块为例,先来看看最常见的用法:以元组形式返回查询记录。如果把代码中的PyMySQL改为MySQLdb,可以轻松切换成mysqlclient模块。

        在在在进口pymysql   在在在db=pymysql.connect (   主机=' localhost ',   用户=' xufive ',   密码=? * * * * * * *”,   db=把菔尽?   charset=' use utf8 '   )   在在在光标=db.cursor ()   在在在游标。从成员执行(“select * id=% s的,(100年))   1   在在在print (cursor.fetchall ())   (100年,370103年* * * * * * * * 0012”,“* 9 ee8e3304d69c3e9260f19c224ea5852129bf030”,“王茁洋’,‘男’,datetime。日期(* * * *、* *、* *),”,“济南”、“济南泉景小学”,“186 * * * * * * * *’,小数(1812.50)))   在在在cursor.close ()   在在在db.close ()      


  

  

查询结果以元组形式返回,有很多不便,我们需要知道元组各元素对应的是表结构中的哪一个字段(列)。下面的代码,实现了以字典形式返回查询记录。同样的,如果把代码中的MySQLdb改为pymysql,可以轻松切换成pymysql模块。

        在在在进口MySQLdb.cursors   在在在db=MySQLdb.connect (   主机=' localhost ',   用户=' xufive ',   密码=? * * * * * * *”,   db=把菔尽?   charset=' use utf8 ',   cursorclass=MySQLdb.cursors.DictCursor   )   在在在光标db.cursor ():   sql=' select *从会员id=% s '   游标。execute (sql,(100年))   print (cursor.fetchall ())   1   ({“id”: 100年,“经办人身份证”:“370103 * * * * * * * * 0012”,“密码”:“* 9 ee8e3304d69c3e9260f19c224ea5852129bf030”、“名称”:“王茁洋”,“性”:“男”、“生日”:datetime。日期(* * * *、* *、* *),标题:”、“地址”:“济南”、“俱乐部”:“济南泉景小学”、“电话”:“186 * * * * * * * *”、“评级”:十进制(1812.50)})      


  

  

事务是关系型数据库的重要特性,NoSQL数据库,分布式数据库通常会淡化,甚至放弃事务。所谓事务是将一组DML(插入、更新、删除)语句组合在一起形成一个逻辑单元,这些操作要么全部执行成功提交(提交),如果不成功就要回退到事务开始之前的状态(回滚),以确保不会停留在错误的中间状态。下面的代码演示了MySQL典型的事务回滚应用。

        在在在进口pymysql   在在在db=pymysql.connect (   主机=' localhost ',   用户=' xufive ',   密码=? * * * * * * *”,   db=把菔尽?   charset=' use utf8 '   )      def事务(db):   试一试:   db.begin ()   #此处加入出错之后需要回滚的DML(插入、更新、删除)语句   db.commit ()   还真   除了:   db.rollback ()   返回假      

浅谈Python访问MySQL的正确姿势