python连接orcl数据库

背景

由于公司项目需要,最近小编在学习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,则表示日期格式需要给它设置序列化。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值