ZiT*_*TAL 11 python sqlalchemy associative
#!/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()
Run Code Online (Sandbox Code Playgroud)
我如何动态地获得TABLES COLUMNS NAMES?在这种情况下id
,并name
Rob*_*ers 15
您可以通过调用找到列,result.keys()
也可以通过v.keys()
在for
循环内调用来访问它们.
这是一个使用示例items()
:
for v in result:
for column, value in v.items():
print('{0}: {1}'.format(column, value))
Run Code Online (Sandbox Code Playgroud)
没有比使用列表理解的单行解决方案更简单的了。这也是最直接的方法:
[col for col in result.keys()]
# return: ['id', 'name']
Run Code Online (Sandbox Code Playgroud)
@Saul 的答案也有效,但您需要注意仅通过 each 迭代第一个元素cursor.description
,以免None
在返回列表的每个元组中得到一堆。
它的效率也较低,因为您需要遍历ResultProxy
, 访问cursor.description
属性,并且对于它们中的每一个只检索索引 0 处的元素。
使用timeit
Python中50万次迭代显示的速度差(0.016 VS 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
Run Code Online (Sandbox Code Playgroud)
虽然建议的解决方案在大约 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
Run Code Online (Sandbox Code Playgroud)
事实上,我怀疑与上面明显简化的示例相比,具有更多列的表上的时间差可能更大。
在实践中,您可能希望动态打印键和值。有两种方法可以解决。首先:
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'}]
Run Code Online (Sandbox Code Playgroud)
或者使用解包:
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'}]
Run Code Online (Sandbox Code Playgroud)
这两种方法都是直接的和 pythonic 的,同时也免除了程序员必须明确指定(或事先知道)列名。
归档时间: |
|
查看次数: |
11136 次 |
最近记录: |