Python 简单的SQLAlchemy关系是如何工作的?

Python 简单的SQLAlchemy关系是如何工作的?,python,database-design,sqlalchemy,Python,Database Design,Sqlalchemy,我不是数据库专家——我只知道基本知识,真的。我为一个小项目学习了SQLAlchemy,我使用的是声明性基本配置,而不是“正常”方式。这种方式似乎简单得多 然而,在设置数据库模式时,我意识到我不理解一些数据库关系概念 如果我以前有多对一关系,例如,作者的文章(每篇文章只能由一位作者撰写),我会在我的文章列中放置作者id字段。但是SQLAlchemy有一个ForeignKey对象,还有一个带有backref-kwarg的关系函数,我不知道这是什么意思 我害怕发现与中间表的多对多关系是什么样子(当我需

我不是数据库专家——我只知道基本知识,真的。我为一个小项目学习了SQLAlchemy,我使用的是声明性基本配置,而不是“正常”方式。这种方式似乎简单得多

然而,在设置数据库模式时,我意识到我不理解一些数据库关系概念

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

我害怕发现与中间表的多对多关系是什么样子(当我需要关于每个关系的附加数据时)

有人能帮我解开这个谜团吗?现在我正在设置允许我的应用程序使用openID身份验证。所以我有这个:

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 = #?

我认为
应该替换为
列(Integer,ForeignKey('users.id'))
,但我不确定——我是否需要将
openids=relationship(“OpenID”,backref=“users”)
放在users类中?为什么?它有什么作用?什么是backref?

是的,如果强制要求,则需要
user\u id=Column(整数,ForeignKey('users.id'))
user\u id=Column(整数,ForeignKey('users.id'),nullable=False)
。这是直接转换为基础数据库模式中的外键,没有魔力


声明关系的简单方法是
OpenID
类中的
user=relationship(Users)
。您还可以在
users
类中使用
users=relationship('OpenID')
backref
参数允许您使用单个声明声明两个关系:它意味着在相关类中自动安装向后关系。我个人更喜欢使用
backref
-s仅用于自我引用关系。原因是我喜欢自文档代码:当您查看它的定义时,您会看到所有已定义的属性,而使用
backref
时,您需要查看其他类(可能在其他模块中定义)。

回答得很好,谢谢。我有点惊讶它花了这么长时间,没有其他人回答。。。似乎很多人都知道。这是一个很好的答案,非常清楚。我也更喜欢自文档代码。因此,自0.5.1以来,SQLAlchemy提供了一种替代
backref
的方法,后者是。这些文件提供了进一步的澄清和示例: