首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用python作为字典的postgresql查询

使用python作为字典的postgresql查询
EN

Stack Overflow用户
提问于 2014-01-16 09:33:56
回答 8查看 60.4K关注 0票数 41

我正在使用Python2.7和PostgreSQL9.1。为了从查询中获取字典,我尝试了下面描述的代码:PostgreSQL

代码语言:javascript
运行
复制
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())

它正在打印下一个答案:

代码语言:javascript
运行
复制
<type 'list'>

打印项目本身,向我显示它是列表。例外的答案是字典。

编辑:

尝试下一个:

代码语言:javascript
运行
复制
ans = cur.fetchall()[0]
print ans
print type(ans)

返回

代码语言:javascript
运行
复制
[288, 'T', 51, 1, 1, '192.168.39.188']
<type 'list'>
EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2020-10-27 12:50:45

如果不想使用psycopg2.extras.DictCursor,可以使用cursor.description为结果创建字典列表

代码语言:javascript
运行
复制
# connect
connection = psycopg2.connect()
cursor = connection.cursor()

# query
cursor.execute("SELECT * FROM myTable")

# transform result
columns = list(cursor.description)
result = cursor.fetchall()

# make dict
results = []
for row in result:
    row_dict = {}
    for i, col in enumerate(columns):
        row_dict[col.name] = row[i]
    results.append(row_dict)

# display
print(result)

我相当经常地使用以下函数:

代码语言:javascript
运行
复制
def select_query_dict(connection, query, data=[]):
    """
    Run generic select query on db, returns a list of dictionaries
    """
    logger.debug('Running query: {}'.format(query))

    # Open a cursor to perform database operations
    cursor = connection.cursor()
    logging.debug('Db connection succesful')

    # execute the query
    try:
        logger.info('Running query.')
        if len(data):
            cursor.execute(query, data)
        else:
            cursor.execute(query)
        columns = list(cursor.description)
        result = cursor.fetchall()
        logging.debug('Query executed succesfully')
    except (Exception, psycopg2.DatabaseError) as e:
        logging.error(e)
        cursor.close()
        exit(1)

    cursor.close()

    # make dict
    results = []
    for row in result:
        row_dict = {}
        for i, col in enumerate(columns):
            row_dict[col.name] = row[i]
        results.append(row_dict)

    return results
票数 8
EN

Stack Overflow用户

发布于 2014-01-16 10:05:40

有很多安德烈·肖钦,

完整的答案是:

代码语言:javascript
运行
复制
#!/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
票数 39
EN

Stack Overflow用户

发布于 2014-01-16 09:40:12

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

代码语言:javascript
运行
复制
type(cur.fetchone())

它将只返回一个类型为:

代码语言:javascript
运行
复制
<class 'psycopg2.extras.DictRow'>

在此之后,您可以使用它作为列表或类似字典:

代码语言:javascript
运行
复制
cur.execute('SELECT id, msg FROM table;')
rec = cur.fetchone()
print rec[0], rec['msg']

您还可以使用简单的游标迭代器:

代码语言:javascript
运行
复制
res = [json.dumps(dict(record)) for record in cursor] # it calls .fetchone() in loop
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21158033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档