16
#!/usr/bin/env python
# -*- coding: utf-8 -*-

from sqlalchemy import create_engine

connection = create_engine('mysql://user:passwd@localhost:3306/db').connect()

result = connection.execute("select * from table")
for v in result:
        print v['id']
        print v['name']
connection.close()

我如何动态获取表格列名称?在这种情况下idname

4

3 回答 3

20

您可以通过调用找到列,也可以通过在循环内result.keys()调用来访问它们。v.keys()for

这是一个使用示例items()

for v in result:
    for column, value in v.items():
        print('{0}: {1}'.format(column, value))
于 2012-01-20T21:12:12.330 回答
9

最直接的解决方案

没有比使用列表理解的单行解决方案更简单的了。也是最直接的方法:

[col for col in result.keys()]
# return: ['id', 'name']

@Saul 的答案也有效,但是您需要小心仅通过 each 迭代第一个元素,以免在返回列表的每个元组中cursor.description得到一堆。None

它的效率也较低,因为您需要遍历ResultProxy、 访问cursor.description属性,并且每个属性只检索索引 0 处的元素。

在 Python 中使用timeit500,000 次迭代显示了速度差异(0.016 与 0.011):

connection = create_engine('sqlite:///rcsample.db').connect()
result = connection.execute("select * from response")
def cursfunc():
    return [ i[0] for i in result.cursor.description ]
print(timeit.timeit("cursfunc()", setup="from __main__ import cursfunc", number=500000))
# return: 0.01606178

虽然建议的解决方案在约 30% 的时间内完成:

connection = create_engine('sqlite:///rcsample.db').connect()
result = connection.execute("select * from response")

def keysfunc():
    return [col for col in result.keys()]
print(timeit.timeit("keysfunc()", setup="from __main__ import cursfunc", number=500000))
# return: 0.01097001

事实上,我的怀疑是,与上面明显简化的示例相比,具有更多列的表上的时间差可能更大。

实践中:键和值

在实践中,您可能希望动态打印键和值。有两种方法可以解决。首先:

results = conn.execute('SELECT * FROM salesperson')
[{column:value for column, value in result.items()} for result in results]
# returns: [{'id': 1, 'name': 'John Doe'}, {'id': 2, 'name': 
# 'Margaret'}, {'id': 3, 'name': 'Anna'}]

或者使用解包:

rows = conn.execute('SELECT * FROM salesperson LIMIT 2').fetchall()
print([{**row} for row in rows])
# returns: [{'id': 1, 'name': 'John Doe'}, {'id': 2, 'name': 'Margaret'}]

这两种方法都是直接的和 pythonic 的,同时也使程序员不必显式指定(或事先知道)列名。

于 2019-05-12T10:50:57.873 回答
5

像这样的东西

headers=[ i[0] for i in result.cursor.description ]

同样的问题从 pyodbc execute() 语句返回列名

于 2017-08-11T19:37:10.027 回答