关于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> 该包不支持查询结果返回字典,需手动对查询结果进行处理,返回字典

关于python第三方包pymmsql的一些使用心得
 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位操作系统)

 

关于python第三方包pymmsql的一些使用心得

上一篇:sql中的exists


下一篇:Mysql Oracle 备份表数据、批量删除表数据