📜  db.relationship sqlalchemy 烧瓶 - SQL (1)

📅  最后修改于: 2023-12-03 14:40:38.785000             🧑  作者: Mango

SQLAlchemy 中的 db.relationship

在 Flask 中使用 SQLAlchemy 时,经常需要处理数据之间的关系。这时候我们可以使用 db.relationship 实现定义模型之间关系的功能。

概述

db.relationship 是 SQLAlchemy 中一种创建关系的方式。它允许我们在两个模型之间定义关系,如一对一、一对多和多对多。

基本使用

下面我们通过一个简单的例子来了解如何使用 db.relationship

我们假设有两个模型 UserPost,一个用户可以写多篇文章。我们可以在 User 模型中定义:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    posts = db.relationship('Post', backref='author', lazy='dynamic')

在这里我们定义了一个名为 posts 的属性,设定了相关的参数,这个属性就表示了我们的 User 与 Post 之间的关系,其中:

  • backref 参数定义了反向关系,它允许我们从 Post 访问 User,比如访问文章作者的名字。
  • lazy 参数定义了访问模式,'dynamic' 表示使用动态查询模式。

接下来我们在 Post 模型中定义:

class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100))
    body = db.Column(db.Text)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))

在这里我们定义了一个外键 author_id,对应的就是 User 模型中的 id,表示文章与作者之间的关系。

到此为止,我们就定义好了两个模型之间的关系,使用起来就像这样:

# 创建一个用户
user = User(name='John')
# 创建一篇文章
post = Post(title='Hello World', body='This is my first post')
# 将文章关联到用户
user.posts.append(post)
# 提交到数据库
db.session.add(user)
db.session.add(post)
db.session.commit()

这样我们就成功地创建了一个用户和一篇文章,并将文章关联到了用户。

一对多关系

在上面的例子中,我们演示了一个一对多的关系,一个用户可以写多篇文章,而一篇文章只属于一个用户。这在实际应用中非常常见,比如一个用户有多个订单等等。

多对多关系

在有些应用中,我们需要处理多对多的关系,比如一个用户可以加入多个组,一个组也可以有多个用户。

我们可以在两个模型中分别定义 db.relationship,比如:

class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    groups = db.relationship('Group', secondary='user_group',
                             backref=db.backref('users', lazy='dynamic'), lazy='dynamic')

class Group(db.Model):
    __tablename__ = 'groups'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))

在这里,我们在 User 模型中定义了一个名为 groups 的属性,表示用户与组之间的关系,使用了 secondary 参数指定了中间表的名称。

Group 模型中我们也定义了一个名为 users 的属性,表示组与用户之间的关系。

接下来我们需要定义中间表 user_group,如下所示:

user_group = db.Table('user_group',
                      db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
                      db.Column('group_id', db.Integer, db.ForeignKey('groups.id')))

在这里我们定义了一个名为 user_group 的表,该表将用户和组之间的关系映射为两个外键。

这样我们就成功地定义了一个多对多的关系。

小结

在 Flask 使用 SQLAlchemy 中,db.relationship 是一种非常便捷的定义模型关系的方式。在实际应用中,我们可以通过它来轻松地处理模型之间的复杂关系。

参考代码:

from flask_sqlalchemy import SQLAlchemy
from flask import Flask

app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///test.db'

db = SQLAlchemy(app)


class User(db.Model):
    __tablename__ = 'users'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))
    posts = db.relationship('Post', backref='author', lazy='dynamic')
    groups = db.relationship('Group', secondary='user_group', backref=db.backref('users', lazy='dynamic'), lazy='dynamic')


class Post(db.Model):
    __tablename__ = 'posts'
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(100))
    body = db.Column(db.Text)
    author_id = db.Column(db.Integer, db.ForeignKey('users.id'))


class Group(db.Model):
    __tablename__ = 'groups'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(50))


user_group = db.Table('user_group',
                      db.Column('user_id', db.Integer, db.ForeignKey('users.id')),
                      db.Column('group_id', db.Integer, db.ForeignKey('groups.id')))

if __name__ == '__main__':
    db.drop_all()
    db.create_all()

    # 创建一个用户
    user = User(name='John')
    # 创建一篇文章
    post = Post(title='Hello World', body='This is my first post')

    # 将文章关联到用户
    user.posts.append(post)
    # 提交到数据库
    db.session.add(user)
    db.session.add(post)
    db.session.commit()

以上是关于 db.relationship 的介绍,希望对大家有所帮助。