我不是数据库专家 - 我真的知道基础知识。我已经为一个小项目选择了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?
答案 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')
课程中使用Users
。 backref
参数允许您使用单个声明声明两个关系:它表示在相关类中自动安装向后关系。我个人更喜欢将backref
- s用于自我引用关系。原因是我喜欢自我记录的代码:当您查看它的定义时,您会看到所有已定义的属性,而使用backref
时,您需要查看其他类(可能在其他模块中定义)。