浅谈Python访问MySQL的正确姿势

 更新时间:2020-01-07 22:11:07   作者:佚名   我要评论(0)

Py2 时代,访问 MySQL 数据库的模块除了 PyMySQL 和 MySQL-python 之外,还有以速度见长的 Umysql,以及非常小众的 Oursql 模块。进入了 Py3 时代之后,PyMySQL 与时

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 install PyMySQL pip install mysqlclient
导入方式 import pymysql import MySQLdb
Python版本 2.7 and >= 3.4 2.7 and >= 3.4
数据库版本 MySQL >= 5.5
MariaDB >= 5.5
MySQL versions from 3.23 to 5.5;
5.0 or newer recommended.
MariaDB should also work.

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

姿势1:以元组形式返回查询记录

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

>>> import pymysql>>> db = pymysql.connect(  host = 'localhost',  user = 'xufive',  password = '********',  db = 'demo',  charset = 'utf8')>>> cursor = db.cursor()>>> cursor.execute('select * from member where id = %s', (100,))1>>> print(cursor.fetchall())((100, '370103********0012', '*9EE8E3304D69C3E9260F19C224EA5852129BF030', '王茁洋', '男', datetime.date(****, **, **), '', '济南', '济南泉景小学', '186********', Decimal('1812.50')),)>>> cursor.close()>>> db.close()

姿势2:以字典形式返回查询记录

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

>>> import MySQLdb.cursors>>> db = MySQLdb.connect(  host = 'localhost',  user = 'xufive',  password = '********',  db = 'demo',   charset = 'utf8',  cursorclass = MySQLdb.cursors.DictCursor)>>> with db.cursor() as cursor:  sql = 'select * from member where id = %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 典型的事务回滚应用。

>>> import pymysql>>> db = pymysql.connect(  host = 'localhost',  user = 'xufive',  password = '********',  db = 'demo',  charset = 'utf8')def transaction(db):  try:    db.begin()    # 此处加入出错之后需要回滚的DML(insert、update、delete)语句    db.commit()    return True  except:    db.rollback()    return False  

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • Linux下通过python访问MySQL、Oracle、SQL Server数据库的方法
  • python访问mysql数据库的实现方法(2则示例)
  • python使用MySQLdb访问mysql数据库的方法
  • Shell、Perl、Python、PHP访问 MySQL 数据库代码实例
  • Python访问MySQL封装的常用类实例
  • Python 分析Nginx访问日志并保存到MySQL数据库实例

果博东方相关的文章

  • 浅谈Python访问MySQL的正确姿势

    浅谈Python访问MySQL的正确姿势

    Py2 时代,访问 MySQL 数据库的模块除了 PyMySQL 和 MySQL-python 之外,还有以速度见长的 Umysql,以及非常小众的 Oursql 模块。进入了 Py3 时代之后,PyMySQL 与时
    2020-01-07
  • Java实现按比抽奖功能

    Java实现按比抽奖功能

    需求是要做几个小游戏的抽奖功能,需要根据不同的游戏有不同的抽奖规则,其中也有很多共性,可归纳为只按奖品占比抽取、奖品占比与奖品数量抽取、分段抽取,为方便起
    2020-01-07
  • 详解vmware14Pro中ubuntu系统界面太小的问题解决

    详解vmware14Pro中ubuntu系统界面太小的问题解决

    1.操作环境vmware14Proubuntu 16.04LTS2.问题描述在使用vmware14Pro安装ubuntu 16.04LTS系统后,屏幕始终比较小,无法根据vmware的变化而变化。3.问题原因
    2020-01-07
  • python全局变量引用与修改过程解析

    python全局变量引用与修改过程解析

    这篇文章主要介绍了python全局变量引用与修改过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下一、引
    2020-01-07
  • pytorch加载自定义网络权重的实现

    pytorch加载自定义网络权重的实现

    在将自定义的网络权重加载到网络中时,报错:AttributeError: 'dict' object has no attribute 'seek'. You can only torch.load from a file that is seekable. P
    2020-01-07
  • python enumerate内置函数用法总结

    python enumerate内置函数用法总结

    这篇文章主要介绍了python enumerate内置函数用法总结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 enu
    2020-01-07
  • python模拟实现斗地主发牌

    python模拟实现斗地主发牌

    题目:趣味百题之斗地主扑克牌是一种非常大众化的游戏,在计算机中有很多与扑克牌有关的游戏。例如,在Windows操作系统下自带的纸牌、红心大战等。在扑克牌类的游戏
    2020-01-07
  • Laravel5.1 框架表单验证操作实例详解

    Laravel5.1 框架表单验证操作实例详解

    本文实例讲述了Laravel5.1 框架表单验证操作。分享给大家供大家参考,具体如下:当我们提交表单时 通常会对提交过来的数据进行一些验证、Laravel在Controller类中使
    2020-01-07
  • Python内置数据类型list各方法的性能测试过程解析

    Python内置数据类型list各方法的性能测试过程解析

    这篇文章主要介绍了Python内置数据类型list各方法的性能测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以
    2020-01-07
  • PyTorch中的Variable变量详解

    PyTorch中的Variable变量详解

    一、了解Variable顾名思义,Variable就是 变量 的意思。实质上也就是可以变化的量,区别于int变量,它是一种可以变化的变量,这正好就符合了反向传播,参数更新的属
    2020-01-07

最新评论