原文: http://www.catonlinepy.tech/
声明:原创不易,未经许可,不得转载
1. 你将学会什么
接第3天表单的使用课程,今天的课程主要涉及到与数据库相关的两个插件的使用,一个是Flask_SQLAlchemy,另外一个是Flask_Migrate。通过今天的学习,你将学会如何对数据库进行基本的操作,以及如何完成数据库的迁移。教程中的代码都会托管到github上,猫姐不厌其烦地强调,在学习本课内容时一定要自己尝试手敲代码,遇到问题再到github上查看代码,如果实在不知道如何解决,可以在日志下方留言。
2.使用Flask_SQLAlchemy管理数据库
2.1 Flask_SQLAlchemy的安装
对于web后台开发工作,必须要掌握的一项技能便是对数据库的CRUD(create, read, update, delete)操作,如果开发过程中直接使用原生的sql语句对数据库进行操作,将是非常痛苦的事件(毕竟sql语句有很多反人类的设计)。Flask_SQLAlchemy插件将开发人员从这个泥潭中解救出来了,我们只需要使用Python的类就能轻松的完成对表的增删改查操作,并且该插件还支持多种数据库类型,如MySQL、PostgreSQL、和SQLite等。
在进入正式学习之前,我们照旧要建立今天的项目目录,如下:
# 进入到虚拟环境目录,激活虚拟环境
maojie@Thinkpad:~/flask-plan/$ source miao_venv/bin/activate
# 到flask-course-primary目录下创建第四天的课程day4目录
(miao_venv) maojie@Thinkpad:~/flask-plan/flask-course-primary$ mkdir day4
# 进入day4目录
(miao_venv) maojie@Thinkpad:~/flask-plan/flask-course-primary$ cd day4
# 新建database_demo目录
(miao_venv) maojie@Thinkpad:~/flask-plan/flask-course-primary/day4$ mkdir database_demo
# 进入到database_demo目录
(miao_venv) maojie@Thinkpad:~/flask-plan/flask-course-primary/day4$ cd database_demo/
# 在database_demo目录中新建__init__.py文件
(miao_venv) maojie@Thinkpad:~/flask-plan/flask-course-primary/day4/database_demo$ touch __init__.py
# 在database_demo包中新建routes.py路由文件
(miao_venv) maojie@Thinkpad:~/flask-plan/flask-course-primary/day4/database_demo$ touch routes.py
# 在day4目录下新建run.py文件
(miao_venv) maojie@Thinkpad:~/flask-plan/flask-course-primary/day4/$ touch run.py
安装Flask_SQLAlchemy插件还是使用pip命令,如下:
# 注意一定要在虚拟环境中
(miao_venv) maojie@Thinkpad:~/flask-plan/flask-course-primary/day4$ pip install Flask_SQLAlchemy
2.2 配置Flask_SQLAlchemy
我们的教程中使用的数据库是SQLite(Linux),主要原因是SQLite足够简单,不需要进行任何配置便可使用,十分适用于入门。下面在__init__.py文件中配置数据库,如下所示:
# 在__init__.py文件中的内容
from flask import Flask
# 从flask_sqlalchemy导入SQLAlchemy类
from flask_sqlalchemy import SQLAlchemy
import os
# 通过Flask创建一个app实例
app = Flask(__name__)
basedir = os.path.abspath(os.path.dirname(__file__))
# Flask_SQLAlchemy插件从SQLALCHEMY_DATABASE_URI配置的变量中获取应用的数据库位置
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'database.db')
# 通过SQLAlchemy创建db实例,表示程序使用的数据库,并且db能够使用Flask_SQLAlchemy的所有功能
db = SQLAlchemy(app)
2.3 构建数据库模型
数据模型通常用来定义数据库中的表及表中的字段。下面代码中的User类和Post类就代表了数据库中的两张表(官方叫法是数据模型)。后面我们会看到,通过这里定义的两个Python类,我们就可以非常容易的完成表的增删改查,以下是routes.py文件中的内容。
# 在routes.py文件中的内容
from database_demo import db
# 定义类User,继承自基类db.Model
class User(db.Model):
# 定义数据库表的名称,为user表
__tablename__ = 'user'
# db.Column类构造函数中的第一个参数表中该字段的类型和该字段的其它属性
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(20), unique=True, nullable=False)
# print User对象时,会打印return的字符串,方便调试
def __repr__(self):
return f"User('{self.username}')"
class Post(db.Model):
__tablename__ = 'post'
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), unique=True, nullable=False)
def __repr__(self):
return f"Post('{self.title}')"