2010-05-27 34 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