python sqlalchemy动态获取列名?
如何动态获取表列名称?在这种情况下,python sqlalchemy动态获取列名?,python,sqlalchemy,associative,Python,Sqlalchemy,Associative,如何动态获取表列名称?在这种情况下,id和name可以通过调用result.keys()来查找列,也可以通过调用for循环中的v.keys()来访问列 下面是一个使用items()的示例: 像这样的 headers=[i[0]表示result.cursor.description中的i] 这里同样的问题最直接的解决方案 无法获得比使用列表理解的一行解决方案更简单的解决方案。这也是最直接的方法: for v in result: for column, value in v.items()
id
和name
可以通过调用result.keys()
来查找列,也可以通过调用for
循环中的v.keys()
来访问列
下面是一个使用items()
的示例:
像这样的
headers=[i[0]表示result.cursor.description中的i]
这里同样的问题最直接的解决方案
无法获得比使用列表理解的一行解决方案更简单的解决方案。这也是最直接的方法:
for v in result:
for column, value in v.items():
print('{0}: {1}'.format(column, value))
@Saul的答案也适用,但您需要小心,不要只在每个游标.description
中迭代第一个元素,以免在返回列表的每个元组中得到一堆None
它的效率也较低,因为您需要遍历ResultProxy
,访问cursor.description
属性,并且对于每个属性,只检索索引0处的元素
在Python中使用timeit
进行500000次迭代,显示了速度差异(0.016 vs 0.011):
虽然建议的解决方案在约30%的时间内完成:
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
事实上,我的怀疑是,与上面明显简化的示例相比,具有更多列的表上的时差可能更大
在实践中:关键和价值
实际上,您可能希望动态打印键和值。有两种方法可以解决这个问题。第一:
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'}]
这两种方法都是直接的和python式的,同时也免除了程序员必须显式指定(或事先知道)列名的麻烦
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'}]