如何将pypyodbc从SQL Server获取的数据解析为指定格式?
我来帮你搞定这个问题!你遇到的核心问题是pypyodbc从SQL Server返回的是原生的Python类型(比如datetime对象、Unicode字符串),而你需要的是特定格式的字符串/数字类型。之前遍历结果没成功,大概率是没针对不同类型做针对性的转换处理,咱们来调整代码解决它:
第一步:明确转换规则
根据你期望的格式,咱们需要对不同字段做差异化处理:
- 日期字段(比如
foo3):把datetime对象转成'YYYY/MM/DD HH:MM:SS'格式的字符串 - 数字字段分两种:
foo2保留整数类型,foo4转成字符串类型 - 字符串字段(比如
foo):把Unicode类型转成普通字符串(Python3里Unicode就是str,但兼容处理更稳妥)
第二步:修改你的write_log函数
咱们给每个字段定义专属的转换规则,遍历查询结果时自动应用这些规则,生成你要的字典格式。修改后的代码如下:
import os import datetime import pypyodbc def write_log(cursor, log_type): if not os.path.exists('OfficeScan_logs'): os.makedirs('OfficeScan_logs') # 获取查询结果的所有字段名,用来映射字典的键 columns = [col[0] for col in cursor.description] # 定义每个字段的转换规则,按需调整 field_converters = { 'foo': lambda x: str(x) if x is not None else None, 'foo2': lambda x: int(x) if x is not None else None, 'foo3': lambda x: x.strftime('%Y/%m/%d %H:%M:%S') if x is not None else None, 'foo4': lambda x: str(x) if x is not None else None } while True: row = cursor.fetchone() if not row: # 没有更多数据就退出循环 break # 构建符合要求的字典 converted_row = {} for col_name, value in zip(columns, row): # 用对应字段的转换器处理,无规则的字段默认转字符串 converter = field_converters.get(col_name, lambda x: str(x) if x is not None else None) converted_row[col_name] = converter(value) # 这里可以把converted_row写入文件,示例:追加到日志 with open(f'OfficeScan_logs/{log_type}.log', 'a', encoding='utf-8') as f: f.write(str(converted_row) + '\n')
关键细节说明
- 字段名映射:通过
cursor.description拿到查询结果的字段列表,能准确把每一列值对应到字典的键上 - 灵活的转换器:用lambda函数定义每个字段的转换逻辑,后续要改格式直接修改对应lambda即可,维护起来很方便
- 空值防护:每个转换器都加了
if x is not None的判断,避免SQL中的NULL值导致转换报错 - Unicode兼容:用
str(x)把Unicode类型转成普通字符串,在Python2/3环境下都能正常工作
这样修改后,你得到的converted_row就是完全符合你期望格式的字典了,比如{'foo': 'bar', 'foo2': 2, 'foo3': '2018/03/09 22:12:54', 'foo4': '15'}。
内容的提问来源于stack exchange,提问作者Victor Ide
相关产品推荐
相关产品推荐

