目录
- Flask数据库操作
-
- 一、数据库基础
-
- [1.1 关系型数据库与非关系型数据库](#1.1 关系型数据库与非关系型数据库)
- 二、Flask-SQLAlchemy
-
- [2.1 安装 Flask-SQLAlchemy](#2.1 安装 Flask-SQLAlchemy)
- [2.2 创建数据库模型](#2.2 创建数据库模型)
-
- [2.2.1 创建 Flask 应用](#2.2.1 创建 Flask 应用)
- [2.2.2 定义模型](#2.2.2 定义模型)
- [2.3 执行 CRUD 操作](#2.3 执行 CRUD 操作)
-
- [2.3.1 创建(Create)](#2.3.1 创建(Create))
- [2.3.2 读取(Read)](#2.3.2 读取(Read))
- [2.3.3 更新(Update)](#2.3.3 更新(Update))
- [2.3.4 删除(Delete)](#2.3.4 删除(Delete))
- [2.4 关系建模(一对多、多对多关系)](#2.4 关系建模(一对多、多对多关系))
- 三、迁移工具
-
- [3.1 安装 Flask-Migrate](#3.1 安装 Flask-Migrate)
- [3.2 配置 Flask-Migrate](#3.2 配置 Flask-Migrate)
- [3.3 初始化迁移环境](#3.3 初始化迁移环境)
- [3.4 创建迁移](#3.4 创建迁移)
- [3.5 应用迁移](#3.5 应用迁移)
- [3.6 管理数据库版本](#3.6 管理数据库版本)
- 四、完整示例
- 总结
Flask数据库操作
在现代应用程序中,数据库操作是必不可少的。在本教程中,我们将详细学习关系型数据库与非关系型数据库的基本概念,选择合适的数据库,然后使用 Flask 的扩展工具 Flask-SQLAlchemy 和 Flask-Migrate 来执行 CRUD 操作和数据迁移。你将通过丰富的案例来理解数据库模型的创建和关系建模。
一、数据库基础
1.1 关系型数据库与非关系型数据库
关系型数据库(Relational Database)是指以表格形式存储数据的数据库。它使用结构化查询语言(SQL)来操作数据。常见的关系型数据库有 PostgreSQL、MySQL、SQLite 等。
非关系型数据库(NoSQL Database)使用灵活的数据模型,可以是键值对、文档、图形或列存储。常见的 non-SQL 数据库有 MongoDB、Redis、Cassandra 等。
选择数据库
在本教程中,我们将采用 SQLite 作为开发阶段的数据库,因为它轻量级、易于使用且不需要额外的配置。在生产环境中,你可以考虑使用 PostgreSQL 或 MySQL 等成熟的关系型数据库。
二、Flask-SQLAlchemy
2.1 安装 Flask-SQLAlchemy
首先,确保你已安装 Flask-SQLAlchemy:
bash
pip install Flask-SQLAlchemy
2.2 创建数据库模型
我们将创建一个简单的博客应用,具有用户和文章两个模型。
2.2.1 创建 Flask 应用
首先,创建一个新的 Flask 应用并设置数据库连接:
python
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
2.2.2 定义模型
接下来,我们将定义用户和文章的模型。每个用户可以有多篇文章,这意味着我们将实现一对多关系。
python
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
articles = db.relationship('Article', backref='author', lazy=True)
class Article(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
def __repr__(self):
return f'<Article {self.title}>'
在这里,我们为 User
模型和 Article
模型创建了表,其中 articles
是与 User
一对多关系的反向引用,user_id
是外键。
2.3 执行 CRUD 操作
现在,我们来看看如何执行 CRUD 操作。
2.3.1 创建(Create)
创建用户和文章,这是一个简单的示例:
python
@app.route('/create_user/<username>')
def create_user(username):
new_user = User(username=username)
db.session.add(new_user)
db.session.commit()
return f'User {username} created!'
@app.route('/create_article/<user_id>/<title>/<content>')
def create_article(user_id, title, content):
new_article = Article(title=title, content=content, user_id=user_id)
db.session.add(new_article)
db.session.commit()
return f'Article {title} created!'
2.3.2 读取(Read)
读取用户及其文章的信息:
python
@app.route('/user/<int:user_id>')
def get_user_articles(user_id):
user = User.query.get(user_id)
if user:
articles = user.articles
return f'User: {user.username}, Articles: {", ".join([a.title for a in articles])}'
return "User not found"
2.3.3 更新(Update)
更新用户或文章的信息:
python
@app.route('/update_user/<int:user_id>/<new_username>')
def update_user(user_id, new_username):
user = User.query.get(user_id)
if user:
user.username = new_username
db.session.commit()
return f'User ID {user_id} updated to {new_username}!'
return "User not found"
2.3.4 删除(Delete)
删除用户或文章:
python
@app.route('/delete_user/<int:user_id>')
def delete_user(user_id):
user = User.query.get(user_id)
if user:
db.session.delete(user)
db.session.commit()
return f'User ID {user_id} deleted!'
return "User not found"
2.4 关系建模(一对多、多对多关系)
我们已经实现了一对多的关系,如果要实现多对多关系,可以创建一个中间表。比如我们可以创建一个 Tag
模型,一个文章可以有多个标签,而一个标签可以应用于多篇文章。
python
article_tags = db.Table('article_tags',
db.Column('article_id', db.Integer, db.ForeignKey('article.id')),
db.Column('tag_id', db.Integer, db.ForeignKey('tag.id'))
)
class Tag(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), unique=True, nullable=False)
articles = db.relationship('Article', secondary=article_tags, lazy='subquery',
backref=db.backref('tags', lazy=True))
三、迁移工具
3.1 安装 Flask-Migrate
Flask-Migrate 是用于处理数据库迁移的工具,建立在 Alembic 的基础之上。
安装 Flask-Migrate:
bash
pip install Flask-Migrate
3.2 配置 Flask-Migrate
在 Flask 应用中集成 Flask-Migrate:
python
from flask_migrate import Migrate
migrate = Migrate(app, db)
3.3 初始化迁移环境
首先,初始化迁移环境:
bash
flask db init
3.4 创建迁移
如果你已经定义了模型,可以创建迁移文件:
bash
flask db migrate -m "Initial migration."
3.5 应用迁移
应用迁移到数据库:
bash
flask db upgrade
3.6 管理数据库版本
你可以使用以下命令查看当前的数据库版本:
bash
flask db current
如果你更改了模型,需要更新数据库,可以重复执行 flask db migrate
和 flask db upgrade
。
四、完整示例
将上述代码整合在一个应用中:
python
import os
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
migrate = Migrate(app, db)
class User(db.Model):
# 用户模型
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True, nullable=False)
articles = db.relationship('Article', backref='author', lazy=True)
class Article(db.Model):
# 文章模型
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(200), nullable=False)
content = db.Column(db.Text, nullable=False)
user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)
class Tag(db.Model):
# 标签模型
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), unique=True, nullable=False)
articles = db.relationship('Article', secondary=article_tags, lazy='subquery',
backref=db.backref('tags', lazy=True))
@app.route('/create_user/<username>')
def create_user(username):
# 创建用户
...
@app.route('/create_article/<user_id>/<title>/<content>')
def create_article(user_id, title, content):
# 创建文章
...
# 添加更多的路由和功能
if __name__ == '__main__':
db.create_all() # 创建所有表
app.run(debug=True)
总结
在本教程中,我们学习了如何使用 Flask-SQLAlchemy 和 Flask-Migrate 进行数据库操作,从基础的模型定义到 CRUD 操作,再到数据库迁移。希望此教程能帮助你更好地理解 Flask 中的数据库操作,为你后续的项目提供帮助。随着你的项目复杂度增加,掌握这些工具和技巧将极大地提升开发效率。