在 Flask-SQLAlchemy 中,当一个表中的列与另一个表中的列建立关系时,通常可以使用 relationship() 函数来定义这种关系。但是,在某些情况下,您可能需要直接引用另一个表中的列,而不是通过关系来引用。例如,当您需要在查询中使用另一个表中的列时,或者当您需要在两个表之间建立多对多的关系时。
解决方案
要直接引用另一个表中的列,可以使用外键约束 (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 表中。否则,数据库会抛出一个错误。
外键约束是一种非常强大的工具,它可以帮助您在数据库中创建复杂的关系。如果您需要在数据库中创建多对多的关系,或者您需要在查询中使用另一个表中的列,那么您就可以使用外键约束来实现。