简单的SQLAlchemy关系如何工作?

Car*_*ers 26 python database-design sqlalchemy

我不是数据库专家 - 我真的知道基础知识.我已经为一个小项目选择了SQLAlchemy,我使用的是声明式基本配置,而不是"正常"方式.这种方式似乎更简单.

但是,在设置我的数据库模式时,我意识到我不了解一些数据库关系概念.

如果我之前有多对一的关系,例如作者的文章(每篇文章只能由一位作者撰写),我会author_id在我的articles专栏中添加一个字段.但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 = #?
Run Code Online (Sandbox Code Playgroud)

我认为?应该替换为Column(Integer, ForeignKey('users.id')),但我不确定 - 我是否需要放入openids = relationship("OpenID", backref="users")Users类?为什么?它有什么作用?什么是backref?

Den*_*ach 41

是的,您需要user_id = Column(Integer, ForeignKey('users.id'))user_id = Column(Integer, ForeignKey('users.id'), nullable=False)是否必须.这直接转换为底层数据库模式中的FOREIGN KEY,没有什么神奇之处.

声明关系的简单方法是user = relationship(Users)OpenID课堂上.你也可以users = relationship('OpenID')Users课堂上使用.backref参数允许您使用单个声明声明两个关系:它表示在相关类中自动安装向后关系.我个人更喜欢只使用backref-s作为自我介绍关系.原因是我喜欢自我记录的代码:当你查看它的定义时,你会看到所有定义的属性,而backref你需要查看其他类(可能在其他模块中定义).

  • 这是一个很好的答案,非常清楚.我也更喜欢自我记录的代码.为此,SQLAlchemy从0.5.1开始提供了`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 (2认同)