Как я могу заставить cx-oracle связывать результаты запроса со словарем, а не с кортежем?
Вот мой код. Я хотел бы найти способ получить результаты из запроса, возвращаемого как список словарей, а не список кортежей. Похоже, cx_oracle поддерживает это с частями документации, говорящей о "привязке". Хотя я не могу понять, как это работает.
def connect():
dsn = cx_Oracle.makedsn("host", 1521, "sid")
orcl = cx_Oracle.connect('scott/[email protected]' + 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()
Ответы
Ответ 1
Bindvars используются для выполнения запроса, такого как
-
По имени (заданные именованные параметры)
cursor = self.db.cursor()
cursor.execute("SELECT bookName, author from books where Id=:bookId" , bookId="155881")
print cursor.bindnames()
напечатает: ['BOOKID']
-
по позиции, указанной в списке значений
cursor = self.db.cursor()
cursor.prepare("insert into books (bookId,title,author,price) values(:1, :2, :3, :4)")
cursor.executemany(None, listOfbookwhichAreTuppleOf4Field )
Чтобы получить то, что вы ожидали, вы можете попробовать что-то вроде этого:
def connect():
dsn = cx_Oracle.makedsn("host", 1521, "sid")
orcl = cx_Oracle.connect('scott/[email protected]' + 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()
Ответ 2
Вот быстро и грязно. Почувствуйте отправку лучшего способа.
def connect():
dsn = cx_Oracle.makedsn("host", 1521, "sid")
orcl = cx_Oracle.connect('scott/[email protected]' + 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()