最开始接触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()
2> 使用该包需要安装微软的插件 VC_redist 以及 msodbcsql.msi (注:VC_redist 与windows系统有关,注意区分32位与64位操作系统)