在数据库关系中直接引用表列

118 阅读2分钟

在 Flask-SQLAlchemy 中,当一个表中的列与另一个表中的列建立关系时,通常可以使用 relationship() 函数来定义这种关系。但是,在某些情况下,您可能需要直接引用另一个表中的列,而不是通过关系来引用。例如,当您需要在查询中使用另一个表中的列时,或者当您需要在两个表之间建立多对多的关系时。

huake_00152_.jpg

解决方案

要直接引用另一个表中的列,可以使用外键约束 (foreign key constraint)。外键约束是指在一个表中定义一个列,该列的值必须与另一个表中的某个列的值匹配。在 Flask-SQLAlchemy 中,可以使用 foreign_keys 参数来指定外键约束。

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import relationship

db = SQLAlchemy()

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    reviewer_id = db.Column(db.Integer, db.ForeignKey('user.id'))

    author = db.relationship(User, foreign_keys=author_id, backref='written')
    reviewer = db.relationship(User, foreign_keys=reviewer_id, backref='reviewed')

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key=True)
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    written = relationship('Article', backref='author', lazy='dynamic')
    reviewed = relationship('Article', backref='reviewer', lazy='dynamic')

在上面的代码中,Article 表中的 author_id 列和 reviewer_id 列都是外键,它们分别引用 User 表中的 id 列。这意味着,每篇文章都必须有一个作者和一个审稿人,并且作者和审稿人的 id 必须存在于 User 表中。

您还可以使用 foreign_keys 参数来指定多个外键约束。例如,以下代码在 Article 表中创建了一个名为 tags 的列,该列可以引用多个标签的 id:

from flask_sqlalchemy import SQLAlchemy
from sqlalchemy.orm import relationship

db = SQLAlchemy()

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    author_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
    tags = db.Column(db.String(255))

    author = db.relationship(User, foreign_keys=author_id, backref='written')

class Tag(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(255))

class ArticleTag(db.Model):
    __tablename__ = 'article_tag'
    article_id = db.Column(db.Integer, db.ForeignKey('article.id'), primary_key=True)
    tag_id = db.Column(db.Integer, db.ForeignKey('tag.id'), primary_key=True)

在上面的代码中,ArticleTag 表是一个多对多的关系表,它将文章和标签联系起来。ArticleTag 表中的 article_id 列和 tag_id 列都是外键,它们分别引用 Article 表中的 id 列和 Tag 表中的 id 列。这意味着,每篇文章都可以有多个标签,并且每个标签也可以属于多篇文章。

当您使用外键约束时,Flask-SQLAlchemy 会自动在数据库中创建外键约束。这意味着,当您在 Article 表中插入一条数据时,您必须确保 author_id 列和 reviewer_id 列的值存在于 User 表中。否则,数据库会抛出一个错误。

外键约束是一种非常强大的工具,它可以帮助您在数据库中创建复杂的关系。如果您需要在数据库中创建多对多的关系,或者您需要在查询中使用另一个表中的列,那么您就可以使用外键约束来实现。