2014-09-05 66 views
0

我試圖創建2個使用SQLAlchemy模型,它們在結構上是相同的,但用途不同,WhitelistBlacklist也參考Magazine(未顯示)。他們都喜歡競選的一個實例(比如說一個政治競選),而這個競選又有一個Politician模型(也沒有顯示)。sqlalchemy模式:沒有唯一的約束匹配給定的鍵給定的表

我想象的Whitelist/Blacklist是多方面的:1至Campaign,因爲可能有多個白色/對黑名單,但在運行遷移我得到sqlalchemy.exc.ProgrammingError: (ProgrammingError) there is no unique constraint matching given keys for referenced table "campaigns"時。還需要有從CampaignPolitician的M:1。

有人可以解釋爲什麼這是由於白名單和黑名單在單獨的表上造成一個唯一的約束錯誤嗎?另外,我怎樣才能使這個關係模式起作用?

class Campaign(Base): 
    __tablename__ = "campaigns" 
    id = Column(Integer, primary_key=True, nullable=False) 
    politician_id = Column(Integer, ForeignKey('politician.id'), nullable=False) 
    description = Column(Text, nullable=True) 


class Whitelist(Base): 
    __tablename__ = "whitelist" 
    id = Column(Integer, primary_key=True, nullable=False) 
    campaign_id = Column(Integer, ForeignKey('campaign.id'), nullable=False) 
    magazine_id = Column(Integer, ForeignKey('magazine.id'), nullable=False) 


class Blacklist(Base): 
    __tablename__ = "blacklist" 
    id = Column(Integer, primary_key=True, nullable=False) 
    campaign_id = Column(Integer, ForeignKey('campaign.id'), nullable=False) 
    magazine_id = Column(Integer, ForeignKey('magazine.id'), nullable=False) 

回答

0

這似乎我們之間的關係,因爲M的確屬違規:1從Whitelist/BlacklistCampaign,而Campaign本身就是一個M:1至Politician。我反而放棄了這個方法和模型,現在看起來像:

class Campaign(Base): 
    __tablename__ = "campaigns" 
    id = Column(Integer, primary_key=True, nullable=False) 
    politician_id = Column(Integer, ForeignKey('politician.id'), nullable=False) 
    description = Column(Text, nullable=True) 


class Listing(Base): 
    __tablename__ = "listings" 
    id = Column(Integer, primary_key=True, nullable=False) 
    campaign_id = Column(Integer, ForeignKey('campaign.id'), nullable=False) 
    magazine_id = Column(Integer, ForeignKey('magazine.id'), nullable=False) 
    listing_type = Column(String, nullable=False) 

原來的做法是爲了適應更好一點到Flask-Admin但這種方式是更好的性能,因爲它會降低額外的查詢,並在前面加入必要的化身。對於那些可能想到這種類型的方法來使用Flask-Admin,你可以使用inline_model()來使界面更清潔,更容易管理。

+1

我看不出爲什麼表A - >表B(M:1),表B - >表C(M:1)是非法的。 – 2015-05-13 10:04:51

相關問題