Подтвердить что ты не робот

Запрос из postgresql с использованием python в качестве словаря

Я использую Python 2.7 и postgresql 9.1. Пытаясь получить словарь от запроса, я пробовал код, как описано здесь: http://wiki.postgresql.org/wiki/Using_psycopg2_with_PostgreSQL

import psycopg2
import psycopg2.extras
conn = psycopg2.connect("dbname=mydb host=localhost user=user password=password")
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute ("select * from port")
type(cur.fetchall())

Он печатает следующий ответ:

<type 'list'>

печать самого элемента, покажите мне, что это список. Исключенным ответом был словарь.

Edit:

Попытка следующего:

ans = cur.fetchall()[0]
print ans
print type(ans)

возвращает

[288, 'T', 51, 1, 1, '192.168.39.188']
<type 'list'>
4b9b3361

Ответ 1

Это нормально: при вызове .fetchall() возвращается список кортежей. Но если вы напишите

type(cur.fetchone())

он вернет только один кортеж с типом:

<class 'psycopg2.extras.DictRow'>

После этого вы можете использовать его как список или как словарь:

cur.execute('SELECT id, msg FROM table;')
rec = cur.fetchone()
print rec[0], rec['msg']

Вы также можете использовать простой итератор курсора:

res = [json.dumps(dict(record)) for record in cursor] # it calls .fetchone() in loop

Ответ 2

Tnx много Андрей Шохин,

полный ответ:

#!/var/bin/python 
import psycopg2
import psycopg2.extras
conn = psycopg2.connect("dbname=uniart4_pr host=localhost user=user password=password")
cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
cur.execute ("select * from port")
ans =cur.fetchall()
ans1 = []
for row in ans:
    ans1.append(dict(row))

print ans1  #actually it return

Ответ 3

Возможно, для дальнейшей оптимизации мы можем иметь

#!/var/bin/python 
import psycopg2
import psycopg2.extras

def get_dict_resultset(sql):
    conn = psycopg2.connect("dbname=pem host=localhost user=postgres password=Drupal#1008")
    cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)
    cur.execute (sql)
    ans =cur.fetchall()
    dict_result = []
    for row in ans:
        dict_result.append(dict(row))
    return dict_result

sql = """select * from tablename"""
return get_dict_resultset(sql)

Ответ 4

Для меня, когда я преобразовал строку в словарь не удалось (решения, упомянутые другими), а также не мог использовать курсор фабрики. Я использую PostgreSQL 9.6.10, код ниже работал для меня, но я не уверен, что это правильный способ сделать это.

    def convert_to_dict(columns, results):
    """
    This method converts the resultset from postgres to dictionary
    interates the data and maps the columns to the values in result set and converts to dictionary
    :param columns: List - column names return when query is executed
    :param results: List / Tupple - result set from when query is executed
    :return: list of dictionary- mapped with table column name and to its values
    """

    allResults = []
    columns = [col.name for col in columns]
    if type(results) is list:
        for value in results:
            allResults.append(dict(zip(columns, value)))
        return allResults
    elif type(results) is tuple:
        allResults.append(dict(zip(columns, results)))
        return allResults

Способ его использования:

conn = psycopg2.connect("dbname=pem host=localhost user=postgres,password=Drupal#1008")
cur = conn.cursor()
cur.execute("select * from tableNAme")

resultset = cursor.fetchall()
result = convert_to_dict(cursor.description, resultset)
print(result)

resultset = cursor.fetchone()
result = convert_to_dict(cursor.description, resultset)
print(result)

Ответ 5

В дополнение к простому возвращению только результатов запроса в виде списка словарей, я бы предложил вернуть пары ключ-значение (column-name: row-value). Вот мое предложение:

import psycopg2
import psycopg2.extras

    conn = None
    try:
        conn = psycopg2.connect("dbname=uniart4_pr host=localhost user=user password=password")

        with conn.cursor(cursor_factory=psycopg2.extras.DictCursor) as cursor:
            cursor.execute("SELECT * FROM table")
            column_names = [desc[0] for desc in cursor.description]
            res = cursor.fetchall()
            cursor.close()
        return map(lambda x: dict(zip(column_names, x)), res))

    except (Exception, psycopg2.DatabaseError) as e:
        logger.error(e)
    finally:
        if conn is not None:
            conn.close()