Как сделать так, чтобы cx-oracle связывал результаты запроса со словарем, а не с кортежем? - PullRequest
14 голосов
/ 17 декабря 2010

Вот мой код. Я хотел бы найти способ, чтобы результаты запроса возвращались в виде списка словарей, а не списка кортежей. Похоже, что 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()

Ответы [ 2 ]

16 голосов
/ 17 декабря 2010

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/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()
0 голосов
/ 17 декабря 2010

Вот быстро и грязно. Почувствуй себя лучше.

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()
...