使用python作为字典从postgresql查询
我正在使用Python 2.7和postgresql 9.1。 尝试从查询中获取字典,我已经尝试了以下代码: 它正在打印下一个答案:使用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
<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)