2010-05-27 62 views
23

我不是數據庫專家 - 我只是知道基礎,真的。我已經選擇了一個小項目的SQLAlchemy,並且我正在使用聲明性的基本配置,而不是「正常」的方式。這種方式似乎簡單得多。簡單的SQLAlchemy關係如何工作?

但是,在設置我的數據庫模式時,我意識到我不理解某些數據庫關係概念。

如果我之前有過多對一的關係,例如作者的文章(每篇文章只能由一位作者撰寫),我會在我的articles列中添加一個author_id字段。但是SQLAlchemy有這個ForeignKey對象,並且有一個與backref kwarg的關係函數,我不知道它有什麼意思。

我很害怕找出與中間表的多對多關係(當我需要關於每個關係的附加數據時)。

有人能爲我揭開這個祕密嗎?現在我正在設置允許我的應用程序使用openID auth。所以,我有這樣的:

from __init__ import Base 
from sqlalchemy.schema import Column 
from sqlalchemy.types import Integer, String 

class Users(Base): 
    __tablename__ = 'users' 
    id = Column(Integer, primary_key=True) 
    username = Column(String, unique=True) 
    email = Column(String) 
    password = Column(String) 
    salt = Column(String) 


class OpenID(Base): 
    __tablename__ = 'openid' 
    url = Column(String, primary_key=True) 
    user_id = #? 

我認爲?應該Column(Integer, ForeignKey('users.id'))更換,但我不知道 - 做我需要把openids = relationship("OpenID", backref="users")在用戶類?爲什麼?它有什麼作用?什麼是backref?

回答

35

是的,你需要user_id = Column(Integer, ForeignKey('users.id'))user_id = Column(Integer, ForeignKey('users.id'), nullable=False)如果它是強制性的。這在底層數據庫模式中直接轉換爲FOREIGN KEY,沒有什麼魔力。

聲明關係的簡單方法是OpenID類中的user = relationship(Users)。您也可以在Users類中使用users = relationship('OpenID')backref參數允許您聲明與單個聲明的關係:它意味着在相關類中自動安裝後向關係。我個人比較喜歡只使用backref-s作爲自我引用關係。原因是我喜歡自我記錄的代碼:當你查看它的定義時,你會看到所有已定義的屬性,而你需要通過其他類(可能在其他模塊中定義)來查看backref

+0

很好的答案,謝謝。我有點驚訝,它花了這麼長時間,沒有人回答...似乎很多人會知道的。哦,好:) – 2010-05-27 04:33:37

+2

這是一個很好的答案,很清楚。我也喜歡自我記錄的代碼。爲此,從0.5.1開始,SQLAlchemy提供了'backref'的替代方法,它是['back_populates'](http://docs.sqlalchemy.org/en/latest/orm/relationship_api.html#sqlalchemy.orm。 relationship.params.back_populates)。該文檔提供了進一步的說明和示例:http://docs.sqlalchemy.org/en/latest/orm/backref.html#relationships- backref – iled 2016-01-21 16:50:18