Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python作为字典从postgresql查询_Python_Postgresql_Python 2.7_Dictionary_Psycopg2 - Fatal编程技术网

使用python作为字典从postgresql查询

使用python作为字典从postgresql查询,python,postgresql,python-2.7,dictionary,psycopg2,Python,Postgresql,Python 2.7,Dictionary,Psycopg2,我正在使用Python 2.7和postgresql 9.1。 尝试从查询中获取字典,我已经尝试了以下代码: 它正在打印下一个答案: <type 'list'> 返回 [288, 'T', 51, 1, 1, '192.168.39.188'] <type 'list'> 这很正常:当您调用.fetchall方法时,它会返回元组列表。但是如果你写 type(cur.fetchone()) 它将只返回一个类型为: <class 'psycopg2.extras

我正在使用Python 2.7和postgresql 9.1。 尝试从查询中获取字典,我已经尝试了以下代码:

它正在打印下一个答案:

<type 'list'>
返回

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

这很正常:当您调用.fetchall方法时,它会返回元组列表。但是如果你写

type(cur.fetchone())
它将只返回一个类型为:

<class 'psycopg2.extras.DictRow'>
也可以使用简单的游标迭代器:

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

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

也许我们可以进一步优化它

#!/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)

对于我来说,当我将行转换为字典时,其他人提到的失败解决方案也无法使用游标工厂。 我正在使用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)

除了仅以字典列表的形式返回查询结果外,我建议返回键值对列名: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()
“/config.py”的内容 !/usr/bin/python PGCONF={ 用户:postgres, 密码:postgres, 主机:localhost, 数据库:数据库名称 } “/main.py”的内容 !/usr/bin/python 从配置导入PGCONF 导入psycopg2 导入psycopg2.extras 开放连接 conn=psycopg2.connect**PGCONF cur=conn.cursorcursor\u factory=psycopg2.extras.DictCursor 声明lambda函数 fetch_all_as_dict=lambda cursor:[dictrow for cursor中的行] 执行您选择的任何查询 cur.executeselect*自表_name limit 1 将所有行作为目录列表获取 打印获取所有内容 关闭光标和连接 当前关闭 康涅狄格州
有一个内置的解决方案可以将结果作为字典的集合:

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

修改自:,版权所有2013

如果您不想使用psycopg2.extras.DictCursor,可以使用cursor为结果创建词典列表。说明:

连接 连接=psycopg2.connect cursor=connection.cursor 查询 cursor.executeSELECT*自myTable 变换结果 columns=listcursor.description 结果=cursor.fetchall 口述 结果=[] 对于结果中的行: 行_dict={} 对于i,枚举列中的列: 行dict[列名称]=行[i] 结果.appendrow_dict 陈列 打印结果 我经常使用以下功能:

def select_query_dictconnection,query,data=[]: 在数据库上运行泛型select查询,返回dict游标 debug'Running query:{}.formatquery 打开游标以执行数据库操作 cursor=connection.cursor logging.debug'Db connection successful' 执行查询 尝试: logger.info“正在运行查询” 如果是lendata: cursor.executequery,数据 其他: cursor.executequery columns=listcursor.description 结果=cursor.fetchall logging.debug“查询已成功执行” 例外情况除外,psycopg2.DatabaseError为e: 日志记录错误 光标。关闭 出口1 光标。关闭 口述 结果=[] 对于结果中的行: 行_dict={} 对于i,枚举列中的列: 行dict[列名称]=行[i] 结果.appendrow_dict 返回结果
print typecur.fetchall[0]也是列表,打印结果表明它的listprint ans正常-它必须类似于列表。typecur.fetchone的结果是什么?>>>typecur.fetchone有趣的是,我可以使用字段名而不是数字。ans[0]类似于ans['id']。但将其转换为json会让我保留在列表中。如果您想要json-将DictRow转换为dict,然后再转换为json:json=json.dumpsdictcursor.fecthonei如果您需要在循环中执行此操作,请使用简单的游标迭代器:对于游标中的记录:…我执行了ans1=[DictRow for row in ans],但当我打印ans1时,这些行的顺序没有改变。使用列表理解时不一样吗?我使用这一行来获取我使用的所有行:data=[dictrow for row in cur.fetchall]我没有检查复杂性时间,也没有使用其他解决方案进行基准测试,但至少对我来说很有吸引力。可能在返回maplambda x:dictzipcolumn\u name,x,res时会有一个额外的参数
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)
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()
from psycopg2.extras import RealDictCursor
cur = conn.cursor(cursor_factory=RealDictCursor)