1. 程式人生 > 其它 >關於python第三方包pymmsql的一些使用心得

關於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 in
data_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位作業系統)