按名称获取列值,而不是在cx_Oracle中的位置
问题描述:
使用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']
答
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']]
答
您可以使用行工厂返回一个响应名称除了指示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存储库。
No.当使用SELECT语句时,API返回一个python“list”,而不是像'FirstName'那样需要支持关键字索引的'dict' – JacobIRR
注意'cursor.execute'返回值在API规范中没有指定(但是[是指定为游标本身](http://cx-oracle.readthedocs.io/en/latest/cursor.html#Cursor.execute)在'cx_Oracle'文档中)。 –