通过sqlalchemy查询`pg_stat_database`视图

时间:2016-07-12 10:12:12

标签: python postgresql 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

即使我没有指定only=['blablabla']部分,它仍然会在初始化类时出错

pg_stats = base.classes.pg_stat_database

即使我提到该计划,仍然是错误。我可以通过上面的代码访问其他表。

修改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")

1 个答案:

答案 0 :(得分:3)

您将无法将视图自动化为模型,因为没有主键:

  

...然后,MetaData中的每个可行表将自动生成一个新的映射类。

  

注意

     

可行,我们的意思是对于要映射的表,它必须指定主键。此外,如果将表检测为两个其他表之间的纯关联表,则不会直接映射该表,而是将其配置为两个引用表的映射之间的多对多表。

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

虽然可以将它反映为通过meta的表格。你当前的表达只是看错了地方。您必须明确地将其传递给正确的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"])