我按照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), ...})
请注意,表和列仅在运行时已知。
答案 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