Automap使用sqlalchemy反映postgres模式中的表

时间:2015-04-27 20:17:58

标签: postgresql sqlalchemy psycopg2

我按照sqlalchemy文档使用automap反映数据库表:exists

当我没有特定的架构,而Postgres使用默认的public架构时,这会按预期工作,我会找到我的表的名称:

>>> m = MetaData()
>>> b = automap_base(bind=engine, metadata=m)
>>> b.prepare(engine, reflect=True)
>>> b.classes.keys()
['ads', 'spatial_ref_sys', 'income']

但是当我具体说明一个明确的架构时,我再也无法访问Base.classes中的表格了。

>>> m = MetaData(schema='geography')
>>> b = automap_base(bind=engine, metadata=m)
>>> b.prepare(engine, reflect=True)
>>> b.classes.keys()
[]

虽然MetaData反映正确:

>>> b.metadata.tables
immutabledict({geography.usa_cbsa_centroids': Table('usa_cbsa_centroids', MetaData(bind=Engine(postgresql://asteroids:***@localhost:5432/asteroids)), Column('GEOID', VARCHAR(length=5), table=<u
sa_cbsa_centroids>, nullable=False), ...})

请注意,表和列仅在运行时已知。

1 个答案:

答案 0 :(得分:10)

答案是SQLAlchemy中的数据库表需要主键,而我的表没有主键。此页面上还有其他信息:http://docs.sqlalchemy.org/en/latest/faq/ormconfiguration.html#how-do-i-map-a-table-that-has-no-primary-key

  

SQLAlchemy ORM需要映射到特定的表   至少一列表示为主键列;   多列,即复合主键当然是完全的   也是可行的。这些列不需要实际知道   数据库作为主键列,尽管它们是个好主意   是。只需将列表现为主键即可   是的,例如,作为行的唯一且不可为空的标识符。

感谢Michael Bayer在sqlalchemy邮件列表上回答这个问题:https://groups.google.com/forum/#!topic/sqlalchemy/8F2tPkpR4bE