在这里插入图片描述
简介:通过 ORM 模型,开发者可以使用面向对象的方式操作数据库,而无需直接编写 SQL 语句。外键是数据库中用于建立表与表之间关系的重要机制,它确保了数据的完整性和一致性。在 Flask-SQLAlchemy 中,外键的使用和映射关系是实现复杂数据模型的关键。本文将深入探讨 Flask 后端开发中 ORM 模型外键基本原理,以及如何通过外键建立和管理数据库表之间的关系。。

目录

一、ORM 模型的外键基本原理
1.1 外键的基本概念
1.2 外键的作用
二、外键的使用以及映射关系
2.1 外键的定义
2.2 映射关系的建立
2.3 查询和操作
三、结束语


🚀 读完本文,你将解锁以下超实用技能和知识储备:

  • 深入理解 ORM 模型中外键的基本原理:掌握外键如何在数据库中建立表与表之间的关系,以及如何通过外键确保数据的完整性和一致性。
  • 学会使用 Flask-SQLAlchemy 定义和管理外键:掌握如何在 Flask-SQLAlchemy 中定义外键,以及如何使用外键建立和管理数据库表之间的关系。
  • 提升数据库设计和管理能力:通过实际代码示例,学习如何设计和管理复杂的数据库模型,提升你的数据库设计和管理能力。

一、ORM 模型的外键基本原理

1.1 外键的基本概念

外键(Foreign Key) 是数据库中用于建立表与表之间关系的重要机制。它确保了数据的完整性和一致性。在 Flask-SQLAlchemy 中,外键通过 db.ForeignKey 方法定义,引用了另一个表的主键字段。

# -*- coding: utf-8 -*-
from flask import Flask, render_template
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)

# MySQL 所在的主机名
HOSTNAME = "127.0.0.1"
# MYSQL 监听的端口号,默认3306
PORT = 3306
# 连接MySQL的用户名,读者用自己设置的
USERNAME = "root"
# 连接 MYSQL的密码,读者用自己的
PASSWORD = "******"
# MYSQL上创建的数据库名称
DATABASE = "backdb_test"

app.config['SQLALCHEMY_DATABASE_URI'] = f"mysql+pymysql://{USERNAME}:{PASSWORD}@{HOSTNAME}:{PORT}/{DATABASE}?charsetut-8mb4"
# 在app.config中设置连接数据库的基本信息
# 然后使用SQLAlchemy(app)创建一个db对象
# SQLAlchemy会自动读取app.config中的配置信息
db = SQLAlchemy(app)

class User(db.Model):
    # 创建一个表,名为user,可自定义
    __tablename__ = "user"
    # 添加主键字段,并定义了类型、主键、自增
    id = db.Column(db.Integer, primary_key = True, autoincrement = True)
    # 添加字段,并指定字符长度,非空
    username = db.Column(db.String(100), nullable = False)
    password = db.Column(db.String(100), nullable = False)

class Article(db.Model):
    # 创建一个表,名为user,可自定义
    __tablename__ = "article"
    # 添加主键字段,并定义了类型、主键、自增
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)

    # 添加作者的外键
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
  • 代码解释:author_id = db.Column(db.Integer, db.ForeignKey("user.id")): 定义了一个名为 author_id 的字段,类型为整数,是外键,引用了 user 表的 id 字段。这意味着每个 Article 对象都与一个 User 对象相关联,通过 author_id 字段来建立这种关系。

1.2 外键的作用

外键的主要作用是确保数据的完整性和一致性。通过外键,可以实现以下功能:

  • 数据完整性:确保引用的字段值必须存在于被引用的表中。
  • 数据一致性:确保数据在多个表之间保持一致,避免数据冗余和不一致。

二、外键的使用以及映射关系

2.1 外键的定义

在 Flask-SQLAlchemy 中,外键通过 db.ForeignKey 方法定义,引用了另一个表的主键字段。外键字段通常是一个整数字段,用于存储被引用表的主键值。

class Article(db.Model):
    __tablename__ = "article"
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))

代码解释new_article = Article(title='My First Article', content='This is the content of my first article.', author_id=new_user.id): 创建了一个新的 Article 对象,并通过 author_id 字段引用了 User 表中的 id 字段,建立了文章与作者之间的关系。

个人理解,敬请指正:其实说成文章与作者之间的关系并不准确不如说成两个对象(User和Article)或者两个表(user和article)之间的关系建立。

2.2 映射关系的建立

在 Flask-SQLAlchemy 中,通过 db.relationship 方法建立表与表之间的映射关系。db.relationship 方法用于定义一个属性,表示一个对象与另一个对象的关系。

class User(db.Model):
    # 创建一个表,名为user,可自定义
    __tablename__ = "user"
    # 添加主键字段,并定义了类型、主键、自增
    id = db.Column(db.Integer, primary_key = True, autoincrement = True)
    # 添加字段,并指定字符长度,非空
    username = db.Column(db.String(100), nullable = False)
    password = db.Column(db.String(100), nullable = False)

    articles = db.relationship("Article", back_populates="author")

class Article(db.Model):
    # 创建一个表,名为user,可自定义
    __tablename__ = "article"
    # 添加主键字段,并定义了类型、主键、自增
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(200), nullable=False)
    content = db.Column(db.Text, nullable=False)

    # 添加作者的外键
    author_id = db.Column(db.Integer, db.ForeignKey("user.id"))
    # 创建属性与其它对象的关系
    author = db.relationship("User", back_populates="articles")

代码解释

  • articles = db.relationship("Article", back_populates="author"): 定义了一个名为 articles 的属性,表示一个用户可以有多个文章。back_populates 参数用于指定反向关系,即 Article 类中的 author 属性。
  • author = db.relationship("User", back_populates="articles"): 定义了一个名为 author 的属性,表示每个文章都有一个作者。back_populates 参数用于指定反向关系,即 User 类中的 articles 属性。

2.3 查询和操作

通过外键和映射关系,可以方便地查询和操作数据库中的数据。

@app.route('/article/add')
def add_article():
    article1 = Article(title="Flask-Python开发系列1", content="段一凡-华北理工大学的博客专栏1")
    article1.author = User.query.get(2)
    article2 = Article(title="Flask-Python开发系列2", content="段一凡-华北理工大学的博客专栏2")
    article2.author = User.query.get(2)
    db.session.add_all([article1, article2])
    db.session.commit()
    return "文章添加成功"
  • 代码解释
  1. article1 = Article(title="Flask-Python开发系列1", content="段一凡-华北理工大学的博客专栏1"): 创建了一个新的 Article 对象 article1,并设置了 title 和 content 属性。
  2. article1.author = User.query.get(2): 通过 User.query.get(2) 查询 User 表中 id 为 2 的用户,并将该用户赋值给 article1 的 author 属性。这里 author 是一个 ORM 属性,通过外键 author_id 与 User 表的 id 字段相关联。
  3. article2 = Article(title="Flask-Python开发系列2", content="段一凡-华北理工大学的博客专栏2"): 创建了一个新的 Article 对象 article2,并设置了 title 和 content 属性。
  4. article2.author = User.query.get(2): 同样,将 User 表中 id 为 2 的用户赋值给 article2 的 author 属性。
  5. db.session.add_all([article1, article2]): 将 article1 和 article2 添加到会话中。
  6. db.session.commit(): 提交会话,将两个文章对象保存到数据库中。

@app.route('/article/query')
def query_article():
    user = User.query.get(2)
    for article in user.articles:
        print(article.author)
        print(article.author.username)
        print(article.title)
    return "文章查找成功"
  • 代码解释
  1. user = User.query.get(2): 查询 User 表中 id 为 2 的用户。
  2. for article in user.articles: 通过 user.articles 属性访问该用户的所有文章。这里 articles 是一个 ORM 属性,通过外键 author_id 与 Article 表的 id 字段相关联。
  3. print(article.author): 打印文章的作者对象。
  4. print(article.author.username): 打印文章作者的用户名。
  5. print(article.title): 打印文章的标题。
  • 渲染结果
    在这里插入图片描述

三、结束语

通过本文的介绍,你已经掌握了 Flask 后端开发中 ORM 模型的外键基本原理,以及如何通过外键建立和管理数据库表之间的关系。外键是确保数据完整性和一致性的关键机制,通过 db.ForeignKeydb.relationship 方法,可以方便地定义和管理表之间的关系。希望本文的内容能够帮助你在 Flask 后端开发中更好地使用 ORM 模型,提升你的开发技能。


最后,感谢你的阅读!如果你觉得本文对你有帮助,不妨点赞和关注,我会继续分享更多关于 Python 和 Flask 开发的实用知识。🚀

关注专栏每周更新,带你从“第一个 Flask 项目”一路进阶到“Docker 部署、JWT 鉴权、微服务拆分”。

版权归作者所有,未经许可请勿抄袭,套用,商用(或其它具有利益性行为)。

欢迎扫码关注:华北理工大学低碳与智能冶金实验室
在这里插入图片描述

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐