如何让 cx-oracle 将查询结果绑定到字典而不是元组?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4468071/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I make cx-oracle bind the results of a query to a dictionary rather than a tuple?
提问by Peter
Here is my code. I would like to find a way to have results from a query returned as a list of dictionaries rather than list of tuples. It seems like cx_oracle supports this with parts of the documentation talking about 'binding'. Though I can't figure out how it works.
这是我的代码。我想找到一种方法将查询结果作为字典列表而不是元组列表返回。似乎 cx_oracle 支持这一点,文档的部分内容讨论了“绑定”。虽然我无法弄清楚它是如何工作的。
def connect():
dsn = cx_Oracle.makedsn("host", 1521, "sid")
orcl = cx_Oracle.connect('scott/tiger@' + dsn)
curs = orcl.cursor()
sql = "select * from sometable"
curs.execute(sql)
result = curs.fetchall()
for row in result:
print row[13] #CATEGORY field order
print row['CATEGORY'] # <- I want this to work ('CATEGORY' is the name of a field in the 'sometable' table)
curs.close()
回答by rapdum
Bindvars are used to execute query such as
Bindvars 用于执行查询,例如
By name(given named parameters)
cursor = self.db.cursor() cursor.execute("SELECT bookName, author from books where Id=:bookId" , bookId="155881") print cursor.bindnames()
按名称(给定命名参数)
cursor = self.db.cursor() cursor.execute("SELECT bookName, author from books where Id=:bookId" , bookId="155881") print cursor.bindnames()
will print : ['BOOKID']
将打印:['BOOKID']
by position given a list of values
cursor = self.db.cursor() cursor.prepare("insert into books (bookId,title,author,price) values(:1, :2, :3, :4)") cursor.executemany(None, listOfbookwhichAreTuppleOf4Field )
按位置给出值列表
cursor = self.db.cursor() cursor.prepare("insert into books (bookId,title,author,price) values(:1, :2, :3, :4)") cursor.executemany(None, listOfbookwhichAreTuppleOf4Field )
To get what you expected you could try something like that:
为了得到你所期望的,你可以尝试这样的事情:
def connect():
dsn = cx_Oracle.makedsn("host", 1521, "sid")
orcl = cx_Oracle.connect('scott/tiger@' + dsn)
curs = orcl.cursor()
sql = "select * from sometable"
curs.execute(sql)
desc = [d[0] for d in curs.description]
result = [dict(zip(desc,line)) for line in curs]
curs.close()
回答by Peter
Here is a quick and dirty. Feel post a better way.
这是一个又快又脏的。感觉发布更好的方法。
def connect():
dsn = cx_Oracle.makedsn("host", 1521, "sid")
orcl = cx_Oracle.connect('scott/tiger@' + dsn)
curs = orcl.cursor()
sql = "select * from sometable"
curs.execute(sql)
fieldNumber = 0
fieldNames={}
for desc in curs.description:
fieldNames[desc[0]]=fieldNumber
fieldNumber+=1
result = curs.fetchall()
for row in result:
print str(row[fieldNames['CATEGORY']])
curs.close()

