Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python sqlalchemy动态获取列名?_Python_Sqlalchemy_Associative - Fatal编程技术网

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'}]