web-dev-qa-db-ja.com

pythonを辞書として使用するpostgresqlからのクエリ

私は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'>

アイテム自体を印刷して、それがリストであることを見せてください。除外された答えは辞書でした。

編集:

次を試す:

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

戻り値

[288, 'T', 51, 1, 1, '192.168.39.188']
<type 'list'>
19
Guy Dafny

正常です:.fetchall()メソッドを呼び出すと、タプルのリストが返されます。しかし、あなたが書くなら

type(cur.fetchone())

次のタイプのタプルを1つだけ返します。

<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
15
Andrey Shokhin

TnxたくさんAndrey Shokhin、

完全な答えは:

#!/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's return
25
Guy Dafny

おそらくそれをさらに最適化して、

#!/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 resultset:
        dict_result.append(dict(row))
    return dict_result

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

行をディクショナリに変換すると失敗し(他の人が言及した解決策)、カーソルファクトリを使用できませんでした。私は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)
2
dheeraj .A

「./config.py」の内容

        #!/usr/bin/python
        PGCONF = {
            "user": "postgres", 
            "password": "postgres", 
            "Host": "localhost", 
            "database": "database_name"
        }

「./main.py」の内容

        #!/usr/bin/python

        from config import PGCONF

        import psycopg2
        import psycopg2.extras

        # open connection
        conn = psycopg2.connect(**PGCONF)
        cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)

        # declare lambda function
        fetch_all_as_dict = lambda cursor: [dict(row) for row in cursor]

        # execute any query of your choice
        cur.execute("""select * from table_name limit 1""")

        # get all rows as list of dicts
        print(fetch_all_as_dict(cur))

        # close cursor and connection
        cur.close()
        conn.close()
0
Rui Costa