關於python第三方包pymmsql的一些使用心得
最開始接觸python操作資料庫,使用的別人的程式碼,基於第三方包pymmsql所開發的,使用一段時間之後,做一點小小的總結,若有不足之處,歡迎指正
1. 查詢返回字典
初始化遊標的時候,設定引數as_dict=True即可,返回的結果中,每一條資料即為一個字典。前提是查詢的sql中,不能出現相同的列名、空列名,否則會報錯
1 import pymssql 2 3 4 conn = pymssql.connect(host="host", user="user", password="password", 5 database="database") 6 cursor = conn.cursor(as_dict=True) 7 cursor.execute(sql) 8 data_dict = cursor.fetchall() 9 cursor.close() 10 conn.close()
2. 返回的查詢結果中文亂碼
遇到這個問題的第一時間,我在連線到資料庫時添加了charset引數,設定為utf8(這裡切記不可寫為 utf-8,否則會報錯),執行後發現並不起作用,後經過驗證,發現設定該引數並不起作用,sqlserver資料庫預設編碼為gbk;後使用手動轉碼的方式解決該問題
1 for data indata_dict: 2 for key in data: 3 if isinstance(data[key], str): 4 try: 5 data[key] = data[key].encode("latin-1").decode("gb18030") 6 except: 7 # print(traceback.format_exc()) 8 pass
3. 結合資料庫連線池dbutils使用出現的問題
設定連線池最大連線數不起作用,本人在使用過程中,隨著程式不斷輪詢呼叫資料庫連線,sqlserver伺服器保持的連線數不斷上升,導致資料庫反應遲鈍,後經檢視dbutils原始碼發現,該包下檢測連線是否存活的機制存在問題,每次檢測結果都返回false,因此每排程一次,連線池都會新建一個數據庫連線,程式執行的時間越長,保持的連線數越多,後捨棄該連線池
4. 捨棄pymmql之後新的操作sqlserver的python包--pyodbc
沒錯,除了pymmsql之後,還有一款微軟官方推出的python庫-pyodbc,該包完美的解決了查詢結果中文亂碼的問題,所以再也不用為中文查詢返回亂碼而煩惱了,同時該包跟pymmsql也有以下幾點不同
1> 該包不支援查詢結果返回字典,需手動對查詢結果進行處理,返回字典
1 # 連線到資料庫 2 connect_str = "DRIVER={ODBC Driver 17 for SQL Server};SERVER=" + ds.host + ";DATABASE=" + ds.database + ";UID=" + ds.username + ";PWD=" + ds.password + ';' 3 cnxn = pyodbc.connect(self.connect_str) 4 5 6 def select_all(sql_template, param=None, as_dict=False): 7 ''' 8 查詢全部資料 9 :param sql_template: sql模板或完整的sql語句 10 :param param: sql模板對應的引數元組 11 :param as_dict: 是否返回字典 12 :return 查詢結果,字典或者是元組 13 ''' 14 cursor = self.cnxn.cursor() 15 try: 16 if param: 17 cursor.execute(sql_template, param) 18 else: 19 cursor.execute(sql_template) 20 rows = cursor.fetchall() 21 if as_dict: 22 columns = [column[0] for column in cursor.description] 23 return [dict(zip(columns, row)) for row in rows] 24 return rows 25 except Exception as e: 26 raise e 27 finally: 28 cursor.close()View Code
2> 使用該包需要安裝微軟的外掛 VC_redist 以及 msodbcsql.msi (注:VC_redist 與windows系統有關,注意區分32位與64位作業系統)