【问题标题】:Automap reflect tables within a postgres schema with sqlalchemy使用 sqlalchemy 自动映射在 postgres 模式中反映表
【发布时间】:2015-07-06 11:05:24
【问题描述】:

我正在关注使用 automap 反映数据库表的 sqlalchemy 文档:http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html#generating-mappings-from-an-existing-metadata

当我没有指定架构并且 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()
[]

虽然元数据反映正确:

>>> 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), ...})

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

【问题讨论】:

    标签: postgresql sqlalchemy psycopg2


    【解决方案1】:

    答案是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多