Python Mysql依賴初探

2021-08-20 03:28:16 字數 1915 閱讀 6139

環境依賴:

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中並不適用,如果要自定義資料型別,就必須指定所涵蓋的所有資料列,這樣很有可能在因為列舉數列不夠全面而導致程式報錯,所以在實際編碼工作中,不建議在這一步轉化資料型別,如有需要,在將資料載入到記憶體後,轉化資料型別。

安裝python MySQL環境

在解壓資料夾下執行 python setup.py build 可能會提示缺少setuptools,首先安裝pypa setuptools 繼續安裝可能提示 environmenterror mysql config not found 解決辦法 1 ubuntu下 執行sudo apt get i...

python MySQL 批量插入

coding utf 8 import pymysql 開啟資料庫連線 db pymysql.connect host localhost port 3306 user username passwd password db database name charset utf8 使用cursor 方...

python Mysql 資料連線

下面這個位址只有32位的 64位還需求其他位址 資料庫鏈結 import mysqldb conn mysqldb.connect host 127.0.0.1 port 3306,user root passwd root db test charset utf8 print conn 鏈結成功列...