背景
由于公司项目需要,最近小编在学习python编写电脑客服端(发现python语言写起还是比较爽),其中就需要用到python自带插件cx-orcl来连接数据库。至于如何连接方式小编就不再详细讲解,网上有教程。思考:我想要的是查询出来的数据直接转换成json格式的,but,可行吗?
经过测试发现不可行,原因是:从orcl数据库查询出来的数据是元组类型的数据,数据格式如下:
taskData=[('任务1的名字很长很长很长', '2019-07-08', '某岗位', '某个类型'), ('任务2的名字很长', '2019-06-08', '某岗位', '某个类型'), ('任务3的名字很长很长', '2016-01-21', '某岗位', '某个类型'), ('任务4的名字', '2019-07-08', '某岗位', '某个类型') ]
这样的数据能转成字典吗,结果是能转,dict(taskData)执行这句代码后就是字典类型了,转出来的格式如下:
大概就是[('任务1的名字很长很长很长': '2019-07-08', '某岗位':'某个类型')) ] 注:前面一个属性变成了key,后面的变成了value ,这样转下去显然不对呀,那怎么玩啊?
通过研究发现,python有个很神奇的功能:就是数据库的字段名作为key,值作为value,这样好舒服啊,不用自己拼key值了,祭出代码,其核心思想就是将元组转换为字典类型再将字典转换为json 就ok了,是不是特简单。哈哈
def query(self, sql, nStart=0, nNum=-1): print("执行查询:" + sql) lists = set rt = [] # 获取cursorsql cur = self._NewCursor() if not cur: return rt # 查询到列表 cur.execute(sql) #将元组转换为字典类型 res = dict_fetchall(cur) # 释放cursor self._DelCursor(cur) return res
# 元组转为字典类型 key ,value def dict_fetchall(cursor): "Return all rows from a cursor as a dict" columns = [col[0] for col in cursor.description] return [ dict(zip(columns, row)) for row in cursor.fetchall() ]
#插入数据 def insert(self, sql): cur = self._NewCursor() cur.execute(sql) # 提交 self._conn.commit() # 释放cursor self._DelCursor(cur)
# 更新 def exec(self, sql): print("执行SQL:" + sql) # 获取cursor rt = None cur = self._NewCursor() if not cur: return rt # 判断sql是否允许其执行 if not self._PermitedUpdateSql(sql): return rt # 执行语句 rt = cur.execute(sql) # 提交 self._conn.commit() # 释放cursor self._DelCursor(cur) return rt
if __name__ == '__main__': # 类使用示例 ora = OracleUtil('sjzx_db') mid = 1467 # ora.execute('insert into Login values( %s, %s)' % \ # (user_id, password)) # sql = 'select * from ptrl_area WHERE id= %s '% (mid)//带参数查询 sql = 'select * from insp_mac' # orcl分页查询 selesql = 'SELECT * FROM(SELECT a. *, ROWNUM rn FROM(SELECT * FROM insp_mac) a WHERE ROWNUM <= 1 * 5)WHERE rn > (1 - 1) * 1' res = ora.query(selesql) jsondatas = json.dumps(res, ensure_ascii=False, cls=ComplexEncoder) print(res) print(jsondatas) # indesertsql = """INSERT INTO person(ID, # NAME, PASSWORD) # VALUES (5, '2','3')""" # ora.insert(sql)
#支持日期json序列化 class ComplexEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(obj, date): return obj.strftime('%Y-%m-%d') else: return json.JSONEncoder.default(self, obj)
注:ensure_ascii:方法为False表示字典转json中文不会乱码;cls=ComplexEncoder,则表示日期格式需要给它设置序列化。