2

以下是我根据数据库查询结果创建字典的一般类方法:

def make_schema_dict(self):
    schema = [i[2] for i in self.cursor.tables()
              if i[2].startswith('tbl_') or i[2].startswith('vw_')]

    self.schema = {table: {'scheme': [row.column_name for row
                                      in self.cursor.columns(table)]}
                   for table in schema}

def last_table_query_as_dict(self, table):
    return {'data': [{col: row.__getattribute__(col) for col in self.schema[table]['scheme']
                      if col != 'RowNum'} for row in self.cursor.fetchall()]}

不幸的是,如您所见,有许多并发症。

比如查询多张表时;生成结果字典需要一些 hackish lambda。

你能想到一些更通用的方法吗?

4

2 回答 2

6

您应该能够使用row.cursor_description使这更简单。这应该为您提供结果的字典列表:

    [{c[0]: v for (c, v) in zip(row.cursor_description, row)} for row in self.cursor.fetchall()]
于 2013-05-21T17:52:37.823 回答
2

可以在此线程中找到一个简洁的解决方案:https ://groups.google.com/forum/?fromgroups#!topic/pyodbc/BVIZBYGXNsk

这个想法的根源是,子类 Connection 使用自定义 Cursor 类,让 Cursor 类自动为您构造字典。我称之为一个花哨的pythonic解决方案。您也可以只拥有一个附加函数 fetchonedict() 并扩展 Cursor 类而不是覆盖,这样您就可以保留默认行为。

class ConnectionWrapper(object): 
    def __init__(self, cnxn): 
        self.cnxn = cnxn 

    def __getattr__(self, attr): 
        return getattr(self.cnxn, attr) 

    def cursor(self): 
        return CursorWrapper(self.cnxn.cursor()) 

class CursorWrapper(object): 
    def __init__(self, cursor): 
        self.cursor = cursor 

    def __getattr__(self, attr): 
        return getattr(self.cursor, attr) 

    def fetchone(self): 
        row = self.cursor.fetchone() 
        if not row: 
            return None 
        return dict((t[0], value) for t, value in zip (self.cursor.description, row)) 

此外,虽然不适用于 PyODBC,但如果您需要一些设计灵感,请查看此 stackoverflow 答案以获取 MySQL 和 OurSQL 的 DictCursor 类的链接。

于 2013-05-22T08:58:05.090 回答