Python-Mysql依赖初探

环境依赖:
MySQL 5.7.17
Python 2.7
Mysql-python 1.2.5

MySQLdb是基于MySQL C API(原生MySQL API)为核心的一个面向Python的接口,封装了许多MySQL C API的方法,简化Python使用MySQL。在原生的MySQL API中,万物皆String。(当然,可以通过自定义conv来实现数据类型转化)。官方解释如下图所示:
这里写图片描述
Eg:原始的数据源中,age列是int类型的,基于原生的API查询结构后,所有结果均为string类型;执行效果如下图所示:
这里写图片描述
可以通过自定义转换dict来实现查询结果的类型转换;具体实现也很简单,只需要在mysql初始化的时候,自定义conv参数即可(eg:将SQL中int转化为Long,将SQL中的float转化为Double),代码样例如下图所示:
这里写图片描述

由于原始API并不是那么的拿来主义,直接基于此操作时需要care的东西太多了,所以才有了MySQLdb这样简单易上手的依赖工具。MySQLdb带来的便捷主要体现在一下两点:a) 封装并提供很多API接口,便于使用;b) 自动识别并转化为原始SQL表的字段类型,从而保证你查询得到的结果类型与SQL表一致。
由于高级的API方法在实际工作时用到了很多,再次就不对此做过多描述;在这里想分享的是数据类型自动识别是所存在的一种情况:基于MySQLdb查询int字段时,实际默认的返回类型并非int类型,而是转化为Long型。Eg:
这里写图片描述
官方给出的解释是:while MySQL’s INTEGER column translates perfectly into a Python integer, UNSIGNED INTEGER could overflow, so these values are converted to Python long integers instead.
简单的说,就是MySQL的Int类型转化为Python的int类型时,可能存在无符号整型精度丢失的情况。如何理解这句话:通常在程序中(Python),不会刻意的定义一个无符号的整型变量,一般都默认的int是有符号整型,eg:int32,在有符号整数的范围为:-2^(32-1) ~ 2^(32-1)-1,无符号整数的范围为:0 ~ 2^32-1,所以当数据库中指定int为无符号整型时,程序中用有符号整数接收,就会存在因为数据范围不一致而导致的数据精度丢失情况。MySQLdb在设计时,为了规避该问题,默认将int类型转化为long 型。这就是为什么查找出的结果是整型全部带有L后缀的原因。

当然Mysqldb也可支持原生API那种通过自定义conv参数的方式来实现数据类型的自定义(不过不建议用户这样操作)。eg:将SQL中int转化为Long,将SQL中的float转化为Double,代码样例如下图所示:
这里写图片描述
因为MySQLdb对于所有的mysql数据类型都有一套自己默认的转化映射关系(详见源码:MySQLdb.converters),对于原生API,可以指定自己想转化的特定数据列;但是该方法在MySQLdb中并不适用,如果要自定义数据类型,就必须指定所涵盖的所有数据列,这样很有可能在因为枚举数列不够全面而导致程序报错,所以在实际编码工作中,不建议在这一步转化数据类型,如有需要,在将数据加载到内存后,转化数据类型。

参考链接:官方网址

猜你喜欢

转载自blog.csdn.net/yhyr_ycy/article/details/80382513