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()]}

残念ながら、ご覧のとおり、多くの合併症があります。

たとえば、複数のテーブルがクエリされる場合。結果の辞書を生成するには、いくつかのハックラムダが必要です。

もう少し一般的な方法を考えてもらえますか?

4

2 に答える 2

2

このスレッドで適切な解決策を見つけることができます: https://groups.google.com/forum/?fromgroups#!topic/pyodbc/BVIZBYGXNsk

カスタム Cursor クラスを使用する Connection をサブクラス化し、Cursor クラスに自動的に dict を構築させるというアイデアの根源です。私はこれを派手な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 ではありませんが、デザインのインスピレーションが必要な場合は、MySQL および OurSQL の DictCursor クラスへのリンクについて、このスタックオーバーフローの回答を確認してください。

于 2013-05-22T08:58:05.090 に答える