如何动态获取Python SQLAlchemy中的列名?

18 投票
3 回答
25388 浏览
提问于 2025-04-17 10:43
#!/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

3 个回答

5

像这样

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

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

14

最简单的解决方案

用列表推导式写一行代码,简直没比这个更简单了。这也是最直接的方法:

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

Saul的答案也可以用,但你需要小心,只遍历每个cursor.description的第一个元素,否则返回的列表中每个元组可能会出现一堆None

这个方法效率也较低,因为你需要遍历ResultProxy,访问cursor.description属性,然后每次只取第一个元素。

用Python的timeit模块测试了50万次,显示了速度差异(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'}]

这两种方法都很直接且符合Python的风格,同时也让程序员不需要明确指定(或提前知道)列名。

21

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

下面是一个使用 items() 的例子:

for v in result:
    for column, value in v.items():
        print('{0}: {1}'.format(column, value))

撰写回答