2013-05-21 51 views
1

下面是從數據庫查詢的結果,創造了我的字典平均普通類方法:作爲字典生成PyODBC查詢的更一般方法?

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需要生成結果字典。

你能想到一些更一般的方法嗎?

回答

5

你應該可以使用row.cursor_description來簡化這個過程。這應該讓你的詞典列表的結果:

[{c[0]: v for (c, v) in zip(row.cursor_description, row)} for row in self.cursor.fetchall()] 
+0

謝謝,看起來像一個偉大的解決方案。投了票。 – stackoverflowuser95

2

純溶液可以在這個主題中找到:https://groups.google.com/forum/?fromgroups#!topic/pyodbc/BVIZBYGXNsk

的想法是的根,子類連接到使用自定義遊標類,讓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,檢查出鏈接DictCursor類MySQL和OurSQL這個計算器的答案,如果你需要一些靈感設計。

+0

感謝您的支持。稍後再測試一下。我在猜測讓它與'fetchmany'和'fetchall'一起工作將是微不足道的。投票表決。 – stackoverflowuser95

相關問題