python+flask后端开发~进阶系列 | Flask后端ORM模型的外键与数据库表之间的关系

简介:通过 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 "文章添加成功"
- 代码解释:
article1 = Article(title="Flask-Python开发系列1", content="段一凡-华北理工大学的博客专栏1"): 创建了一个新的 Article 对象 article1,并设置了 title 和 content 属性。article1.author = User.query.get(2): 通过 User.query.get(2) 查询 User 表中 id 为 2 的用户,并将该用户赋值给 article1 的 author 属性。这里 author 是一个 ORM 属性,通过外键 author_id 与 User 表的 id 字段相关联。article2 = Article(title="Flask-Python开发系列2", content="段一凡-华北理工大学的博客专栏2"): 创建了一个新的 Article 对象 article2,并设置了 title 和 content 属性。article2.author = User.query.get(2): 同样,将 User 表中 id 为 2 的用户赋值给 article2 的 author 属性。db.session.add_all([article1, article2]): 将 article1 和 article2 添加到会话中。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 "文章查找成功"
- 代码解释:
user = User.query.get(2): 查询 User 表中 id 为 2 的用户。for article in user.articles: 通过 user.articles 属性访问该用户的所有文章。这里 articles 是一个 ORM 属性,通过外键 author_id 与 Article 表的 id 字段相关联。print(article.author): 打印文章的作者对象。print(article.author.username): 打印文章作者的用户名。print(article.title): 打印文章的标题。
- 渲染结果:

三、结束语
通过本文的介绍,你已经掌握了 Flask 后端开发中 ORM 模型的外键基本原理,以及如何通过外键建立和管理数据库表之间的关系。外键是确保数据完整性和一致性的关键机制,通过 db.ForeignKey 和 db.relationship 方法,可以方便地定义和管理表之间的关系。希望本文的内容能够帮助你在 Flask 后端开发中更好地使用 ORM 模型,提升你的开发技能。
最后,感谢你的阅读!如果你觉得本文对你有帮助,不妨点赞和关注,我会继续分享更多关于 Python 和 Flask 开发的实用知识。🚀
关注专栏,每周更新,带你从“第一个 Flask 项目”一路进阶到“Docker 部署、JWT 鉴权、微服务拆分”。
版权归作者所有,未经许可请勿抄袭,套用,商用(或其它具有利益性行为)。
– 欢迎扫码关注:华北理工大学低碳与智能冶金实验室
更多推荐

所有评论(0)