2015-04-27 78 views
4

一個Postgres架構中的表,我下面的反映使用automap數據庫表中的SQLAlchemy的文檔:http://docs.sqlalchemy.org/en/latest/orm/extensions/automap.html#generating-mappings-from-an-existing-metadata自動映射反映SQLAlchemy的

當我做不特定的模式,和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), ...}) 

注意,表和列在運行時才知道。

回答

6

答案是,在SQLAlchemy的數據庫表需要一個主鍵,我的表沒有一個。此頁面上還有其他信息:http://docs.sqlalchemy.org/en/latest/faq/ormconfiguration.html#how-do-i-map-a-table-that-has-no-primary-key

SQLAlchemy ORM爲了映射到一個特定的表,需要有至少一個表示爲主鍵列的列;多列,即複合主鍵當然也完全可行。這些列不需要實際被 數據庫知道爲主鍵列,儘管它們是 是個好主意。僅需要列作爲主鍵 的行爲,例如,作爲一行的唯一且不可空的標識符。

感謝邁克爾·拜爾回答這個SQLAlchemy的郵件列表:https://groups.google.com/forum/#!topic/sqlalchemy/8F2tPkpR4bE