psycopg2.extras.DictCursor не возвращает dict в postgres - PullRequest
0 голосов
/ 03 июня 2018

Я использую psycopg2 для доступа к базе данных postgres, используя следующий запрос.Чтобы вернуть словарь из выполненного запроса, я использую DictCursor в моем курсоре, но мой вывод - это список, а не диктонар.

Вот программа и вывод ниже.

import psycopg2.extras

try:
    conn = psycopg2.connect("user='postgres' host='localhost' password='postgres'",
                            )
except:
    print "I am unable to connect to the database"

cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

cur.execute("""SELECT datname from pg_database""")


rows = cur.fetchall()
print "\nShow me the databases:\n"
print rows

Выход: -

[['template1'], ['template0'], ['postgres'], ['iip'], ['test'], ['test_postgres'], ['testdb']]

1 Ответ

0 голосов
/ 03 июня 2018

Это выглядит как список, пахнет как список, но это DictRow .

rows = cur.fetchall()
for row in rows :
    print(type(row))

#>>> <class 'psycopg2.extras.DictRow'>

Это означает, что вы все еще можете использовать имена столбцов в качестве ключей для доступа к данным:

rows = cur.fetchall()
print([row['datname'] for row in rows])

Этот класс наследуется непосредственно от встроенного list и добавляет все необходимые методы для реализации словарной логики, но не меняет представление __repr__ или __str__, поэтому выходные данные совпадают со списком.

class DictRow(list):
    """A row object that allow by-column-name access to data."""

fetchall() упаковывает все запрашиваемые строки в списке без указания точноговведите.

Кстати, может быть, вы ищете этот вид курсора: RealDictCursor ?

...