简单的SQLAlchemy关系如何工作?

时间:2010-05-27 01:00:14

标签: python database-design sqlalchemy

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

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

如果我之前有多对一的关系,例如作者的文章(每篇文章只能由一位作者撰写),我会在我的{{1}中放置一个author_id字段列。但SQLAlchemy有这个ForeignKey对象,以及与backref kwarg的关系函数,我不知道它有什么意思。

我很害怕找出与中间表的多对多关系(当我需要关于每个关系的其他数据时)。

有人可以为我揭开这个神秘面纱吗?现在我正在设置为我的应用程序允许openID auth。所以我有这个:

articles

我认为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'))放在Users类中?为什么?它有什么作用?什么是backref?

1 个答案:

答案 0 :(得分: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')课程中使用Usersbackref参数允许您使用单个声明声明两个关系:它表示在相关类中自动安装向后关系。我个人更喜欢将backref - s用于自我引用关系。原因是我喜欢自我记录的代码:当您查看它的定义时,您会看到所有已定义的属性,而使用backref时,您需要查看其他类(可能在其他模块中定义)。