【问题标题】:python sqlalchemy get column names dynamically?python sqlalchemy动态获取列名?
【发布时间】:2012-02-15 09:14:09
【问题描述】:
#!/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

【问题讨论】:

    标签: python sqlalchemy associative


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      最直接的解决方案

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

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

      @Saul 的回答也有效,但您需要小心遍历每个 cursor.description 的第一个元素,以免在返回列表的每个元组中得到一堆 None

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

      在 Python 中使用 timeit 进行 500,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'}]
      

      这两种方法都是直接的和 Python 的,同时也免除了程序员必须明确指定(或事先知道)列名。

      【讨论】:

        【解决方案3】:

        类似的东西

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

        同样的问题return column names from pyodbc execute() statement

        【讨论】:

          猜你喜欢
          • 2015-12-31
          • 2019-02-14
          • 2023-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-08-22
          • 2014-09-27
          • 1970-01-01
          相关资源
          最近更新 更多