2016-07-12 15 views
0

pg_stat_databaseにアクセスしようとしていますが、sqlalchemyのメタデータで表示していますが、そのエラーが発生しています。ここに私のコードはsqlalchemyを介して `pg_stat_database`ビューを問い合わせます

engine = "Some_engine_specification" 
metadata = MetaData() 
metadata.reflect(engine, views=True, only=["table", "table2", "pg_stat_database"] 
base = automap_base(metadata=metadata) 
base.prepare() 

pg_stat_databaseを反映することはできませんエラーをスローします。私はまだスキーム、エラーに言及している場合でも

pg_stats = base.classes.pg_stat_database 

としてクラスを初期化しながら、

は私がonly=['blablabla']部分を指定いけない場合でも、それはまだエラーを与えます。私は上記のコードで他のテーブルにアクセスすることができます。

編集1

は、IljaEveriläに感謝します。正しく反映し、テーブルのインスタンスを取得するには、使用が次

engine = "some_engine_specification" 
metadata = MetaData() 
metadata.reflect(engine, only=["table1", "table2"]) 
metadata.reflect(engine, schema='pg_catalog', views=True, only=["pg_stat_database"] 
base = automap_base(metadata=metadata) 
base.prepare() 
table1 = base.classes.table1 
table2 = base.classes.table2 
pg_stat_database = base.metadata.sorted_tables[index_of_pg_stat_database] 
# To query 
result = scoped_db_session.query(pg_stat_database).filter(pg_stat_database.columns.datname=="your_database") 
+0

正しいインデックスをプログラムで取得するにはどうすればよいですか? –

+0

あなたは 'index_of_pg_stat_database'を意味しますか? – Niyojan

+0

はい。あなたが 'only'に渡すあなたのリストを組み合わせて並べ替え、次にインデックスを作成すればいいのでしょうか?汚い感じ。 –

答えて

3
主キーが存在しないので、あなたがモデルとしてビューを自動マップすることはできません

...その後、each 実行可能 MetaData内のテーブルは自動的に生成された新しいマップされたクラスを取得します。 生きことで

、我々はマッピングするテーブルのために、それは主キーを指定しなければならないことを意味します。さらに、テーブルが2つの他のテーブル間の純粋な関連テーブルであると検出された場合、それは直接マップされず、代わりに2つの参照テーブルのマッピング間で多対多テーブルとして構成されます。メタ通じテーブルがが可能であるとして、それを反映し

http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html#basic-use

。あなたの現在の表現はちょうど間違った場所を探しています。あなたは明示的にそれを正しく渡す必要がありますschema

# Reflect from schema "pg_catalog" 
metadata.reflect(engine, views=True, schema="pg_catalog", 
       only=["pg_stat_database"]) 
# Reflect from the default schema of this meta, if any 
metadata.reflect(engine, only=["table", "table2"]) 
+0

'metadata.reflect'にエラーがなくなりました。どうすればインスタンスog' pg_stats_database'を得ることができますか? 'base.classes.pg_stat_database'はエラーを投げています。 'base.metadata.sorted_tables [2] .pg_catalog.pg_stat.database'で見ることができますが、長すぎます。 – Niyojan

+0

主キーがないため、問題のビューのマップされたクラスを作成することはできません。したがって、 'base.classes'でアクセスすることはできません。あなたの唯一の選択肢は、テーブルを使用することです。より短い名前に割り当てるだけです: 'pg_stat_database = metadata.tables ['pg_catalog.pg_stat_database']'そしてそれを使用してください。 –

+0

お返事ありがとうございました。 – Niyojan

関連する問題