2017-04-22 96 views
0

使用cx_Oracle,我從Oracle數據庫中選擇數據。按名稱獲取列值,而不是在cx_Oracle中的位置

curs = cxn.cursor() 
result = curs.execute(SELECT FirstName, LastName FROM Person) 

有沒有辦法只返回沒有數字索引的名字?例如:

for row in result: 
    result[0] #will return the first column 

我所希望做的是調用像result['FirstName']

+1

No.當使用SELECT語句時,API返回一個python「list」,而不是像'FirstName'那樣需要支持關鍵字索引的'dict' – JacobIRR

+0

注意'cursor.execute'返回值在API規範中沒有指定(但是[是指定爲遊標本身](http://cx-oracle.readthedocs.io/en/latest/cursor.html#Cursor.execute)在'cx_Oracle'文檔中)。 –

回答

0

DB API 2.0的值不提供這樣的能力。各種各樣的DB客戶端模塊提供的這種東西都是非標準的。

的API確實,但是,提供cursor.description只讀與此信息屬性:

此只讀屬性是7項序列的序列。

每個這些序列中包含的信息描述一個結果 柱:

  • 名稱
  • 類型代碼
  • display_size
  • internal_size
  • 精度
  • 規模
  • null_ok

前兩個項目(名稱和類型代碼)是強制性的,其他 5是可選的且被設定爲無如果沒有有意義的值可以是 提供。

<...>

所以,你可以這樣做:

for row in result: 
    result[(i for i,cd in enumerate(result.description) if cd[0]=='column_name').next()] 

而羅嗦,只應調用一次,所以這是合理的這個移動到一個子程序:

def columns(cursor): 
    return {cd[0]:i for i,cd in enumerate(cursor.description)} 
<...> 
result=c.execute(...) 
ccls=columns(result) 
for row in result: 
    row[ccls['name']] 
0

您可以使用行工廠返回一個響應名稱除了指示CES。一個簡單的方法來做到這一點是使用collections.namedtuple,如下面的代碼(使用cx_Oracle測試套件設置):

from __future__ import print_function # needed for Python 2.7 

import cx_Oracle 
import collections 

connection = cx_Oracle.Connection("cx_Oracle/[email protected]/orcl") 
cursor = connection.cursor() 
cursor.execute("select * from TestStrings") 
names = [c[0] for c in cursor.description] 
cursor.rowfactory = collections.namedtuple("TestStrings", names) 
for row in cursor: 
    print(row) 
    print(row[0]) 
    print(row.STRINGCOL) 

您還可以在cx_Oracle庫提供的樣品,以及,爲進一步的啓發。

https://github.com/oracle/python-cx_Oracle/blob/master/samples/RowsAsInstance.py

您可以使用輸出類型處理器以及使這一切渾然一體了。稍後我會將該示例添加到cx_Oracle存儲庫。