zoukankan      html  css  js  c++  java
  • Python连接Oracle数据库,以字典形式返回结果

    众所周知,Python连接Oracle数据库,一般都使用cx_Oracle这个包。

    但关键是cx_Oracle这个包,返回的结果,都是元组或者列表。

    如以下代码:

     1 import cx_Oracle
     2 import os
     3 
     4 os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
     5 
     6 connection = cx_Oracle.connect("Booker", "123456", "172.18.240.31:1521/Book")
     7 
     8 cursor = connection.cursor()
     9 cursor.execute(" select * from book",)
    10 
    11 a = cursor.fetchall()
    12 for c in a:
    13     print(c)
    14 
    15 cursor.close()
    16 connection.close()

    其返回的结果如下:

    ('PHP',  '黄大力', '外星出版社', '34')

    这是一个元组。无法返回包含字段名的字典格式。

    查阅cx_Oracle的官方文档:https://oracle.github.io/python-cx_Oracle/

    也没有找到相应的方法。

    对于我这种强迫症的人来说,这是不可接受的。

    能不能有其它的办法呢?找了一下,发现cursor有一个属性description,是显示字段的描述的,打印看看是什么结果:

    print(cursor.description)

    显示如下:

    [ ('book_name', <class 'cx_Oracle.STRING'>, 300, 900, None, None, 1),, ('author', <class 'cx_Oracle.STRING'>, 300, 900, None, None, 1), ('public', <class 'cx_Oracle.STRING'>, 300, 900, None, None, 1), ('price', <class 'cx_Oracle.STRING'>, 300, 900, None, None, 1)]

    是一个列表,而每一个字段则是一个元组,元组的第一个元素则是字段名。

    查阅cx_Oracle的官方文档,其对cursor.description是这么描述的:

    该只读属性是7项序列的序列。这些序列中的每一个都包含描述一个结果列的信息:(name,type,display_size,internal_size,precision,scale,null_ok)。对于不返回行的操作,或者如果游标execute()尚未通过该方法调用操作,此属性将为None 。

    该类型将是模块级别定义的类型对象之一。

    这就好办了。

    for d in cursor.description:
        print(d)

    输出:

    ('book_name', <class 'cx_Oracle.STRING'>, 20, 60, None, None, 0)
    ('author', <class 'cx_Oracle.DATETIME'>, 23, None, None, None, 1)
    ('public', <class 'cx_Oracle.STRING'>, 20, 60, None, None, 1)
    ('price', <class 'cx_Oracle.STRING'>, 300, 900, None, None, 1)

    嗯,对的,每一个元素都是一个元组,我们就可以通过d[0]把字段名取出来了。

    for d in cursor.description:
        print(d[0])

    输出:

    book_name
    author
    public
    price

    那这样,我们就可以使用一个for循环,把字段名取出来。以下这段语句,是循环cursor.description,取出第1个元素,然后组成一个列表。

    cols = [d[0] for d in cursor.description]
    print(cols)

    输出:

    ['book_name', 'author', 'public', 'price']

    那么,怎么和查询结果组合成字典呢?嗯,使用zip函数。

    zip() 函数用于将可迭代对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象。

    zip() 函数语法:

    zip(iterable1,iterable2, ...)

    参数说明:

    • iterable -- 一个或多个可迭代对象(字符串、列表、元祖、字典)

    没错,字符串、列表、元组、字典都是可迭代对象。

    zip函数就像一个拉链一下,把两个可迭代对象的元素一一对应起来。如果各个可迭代对象的元素个数不一致,则返回的对象长度与最短的可迭代对象相同。

    使用以下代码,即可形成字段名和结果的字典了。

     1 import cx_Oracle
     2 import os
     3 
     4 os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'
     5 
     6 connection = cx_Oracle.connect("Booker", "123456", "172.18.240.31:1521/Book") 
     7 cursor = connection.cursor() cursor.execute("select * from book")  
     8 a = cursor.fetchall() 
     9 cols = [d[0] for d in cursor.description] 
    10 print(cols) 
    11 for row in a:
    12   b = dict(zip(cols, row)) 
    13   print(b['book_name']) 
    14 cursor.close() 
    15 connection.close()

    输出:

    PHP

    这样我们就可以使用b['字段名']的方式进入各种操作了,又清晰又方便。

  • 相关阅读:
    解决MySql报错:1130
    Mac 安装 RabbitMQ 出现的问题
    Java 中的关键字
    ExtJS 去除水印
    MAC VMware fusion 12.1.0 Centos7 网络配置
    Linux常见目录结构
    CentOS 设置网络及安装 ifconfig
    Web项目部署到IIS的方法
    异常处理-System.IO.IOException: 由于远程方已关闭传输流,身份验证失败
    C#委托总结-匿名方法&Lambda表达式
  • 原文地址:https://www.cnblogs.com/dhanchor/p/11111247.html
Copyright © 2011-2022 走看看