2017-04-22 93 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存储库。