質問: [] for row in results: dict_result.append(row._asdict()) #dict_result.append(dict(row)) with open(filename, "w") as f: json.dump(results, f, indent=4) ``` 以下のようなテーブルがあったとして、実行すると順番がカラム1〜4と順番の通りに出力さず順番がシャッフルされます。 | カラム1 | カラム2 | カラム3 | カラム4 | | --- | --- | --- | --- | | A | B | C | D | を上記コードで実行すると、以下のような感じでバラバラにされてしまいます。(ファイル出力時) { "カラム2": "B", "カラム1": "A", "カラム4": "D", "カラム3": "C" } printすると以下で表示されています。 [Record(column1='A ', column2='B ', column3='C ', column4='D ')] これを、以下のようにテーブルのカラムの順番で表示させたいです。 { ”カラム1":"A", ”カラム2":"B", ”カラム3":"C", "カラム4":"D" } 検索をかけているのですがうまくいきません。以下、参考にしているURLです。 Pythonでリスト(配列)に要素を追加 Python psycopg2 で dict形式で結果を取得 Pythonで辞書を作成するdict()と波括弧、辞書内包表記 すみませんが、よろしくお願い致します。 〜備考〜 ・言語:Python ・DB:postgresql ・Create文: create table test ( column1 character(10) ,column2 character(10) ,column3 character(10) ,column4 character(10) ) ・insert文 insert INTO test ( column1, column2, column3, column4 ) VALUES ( 'A', 'B', 'C', 'D' )
回答: 実は、Python3.5以下のdictは**挿入した順番が維持されません**。なので、順番を保持するにはcollentionsモジュールのOrderedDictを使う必要があります。 How to preserve column order while using psycopg2.extras.RealDictCursor ここに詳しいですが、2行目`cur = conn.cursor(cursor_factory=psycopg2.extras.DictCursor)`の代わりに`psycopg2.extras.NamedTupleCursor`をつかって、7行目で`dict_result.append(dict(row))`を`dict_result.append(row._asdict())`とすればよいかと思います。