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['字段名']的方式進入各種操作了,又清晰又方便。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM