
Flask-SQLAlchemy
Flask-SQLAlchemy 是 Flask 的扩展,它为您的应用程序添加了对 SQLAlchemy 的支持。它旨在通过提供有用的默认值和额外的协助程序来简化将 SQLAlchemy 与 Flask 结合使用,从而更轻松地完成常见任务。
这是官方的介绍,实则对于刚想写个简单博客的同学来说,这个东西说了等于没说,由于他不知道SQLAlchemy是什么?能干什么?所以自然对以上这段话就无从理解!
我这里简单说一下,无论是博客类网站还是更大的商城类网站,我们在页面上所看到的数据都是存储在数据库,那数据库主要分为关系型数据库和非关系型数据库,那么,如何把数据存储到数据库以及如何把数据库中的数据查询到页面,也就是所谓的增删改查操作,我们都要用到sql语法,当然这又是另外的一个知识点,学起来也是超级的繁琐复杂,那为了我们快速实现增删改查的目的,有大佬就创作了这样一个框架,使用了一种叫做《Object Relation Mapping》对象关系映射的技术,也就是我们所说的ORM,这个在django框架中是自带的,但与SQLAlchemy框架的用法及底层实现有一些区别。这个我们无需去过多关注,我只要知道SQLAlchemy的API提供了执行数据库CRUD操作的方法,因此我们不必在程序中编写复杂难懂的原始SQL语句,就可以达到增删改查的目的。
那么,Flask-SQLAlchemy是对SQLAlchemy的进一步封装,使得更加容易的在Flask项目中使用SQLAlchemy!
安装Flask-SQLAlchemy
pip install Flask-SQLAlchemy
- 官方文档:https://flask-sqlalchemy.palletsprojects.com/en/2.x/
使用
1、在项目目录(RealProject)的__init__.py中引入SQLAlchemy
# RealProject/__init__.py
from flask_sqlalchemy import SQLAlchemy
# 实例化SQLAlchemy对象
db = SQLAlchemy()
2、在工厂函数create_app中与app绑定关系
def create_app(test_config=None):
# create and configure the app
app = Flask(__name__, instance_relative_config=True)
app.config.from_mapping(
SECRET_KEY='dev',
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
)
# 绑定数据库
db.init_app(app)
...省略部分代码
return app
3、创建模型数据
这一节我们来先创建一个博客的分类模型数据来认识一下模型的创建
在app/blog/models.py中创建模型如下
from datetime import datetime
from RealProject import db
class Category(db.Model):
"""分类模型
"""
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), nullable=False)
icon = db.Column(db.String(128), nullable=True)
add_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow, ) # 创建时间
pub_date = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow, nullable=False) # 更新时间
def __repr__(self):
return '<Category %r>' % self.name
学习过django的同学有没有一股熟悉的味道,和django的创建模型是不是超级类似,只是一些语法上的不同!
我们一起来看下这些字段都做了什么?
- id 该模型的主键,类型为Integer,primary_key为True代表主键
- name 分类名称,String类型,可变字符类型,映射到数据库中是varchar类型.
- icon 分类图标,类型与name一致,区别是nullable=True,就是允许为空,即默认值是null
- add_date 创建时间,nullable=False不能为空,default=datetime.utcnow设置为当前时区时间
- pub_date 更新时间,主要关注下onupdate=datetime.utcnow,这个可以更新每次编辑时的时间保存
其他更多的类型,我们在后来用到的时候再去了解,基本的类型我也整理了一篇文章,大家可以参考! 类型参考:
http://www.lotdoc.cn/blog/detail/172/
配置MySQL数据库
我们最开始已经说过了项目的默认配置在工厂函数中已经引入了,以下就是项目的默认配置
app.config.from_mapping(
SECRET_KEY='dev',
DATABASE=os.path.join(app.instance_path, 'flaskr.sqlite'),
)
但是,一般的做法是配置和代码是区别开的,我们目前要让他从文件中读取配置,所以就直接删除这句,或者注释掉即可,最开始引入是为了介绍Flask加载配置文件的几种方法!
目前我们把所有的配置项移动到项目目录的settings.py文件中,配置如下:
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
DEBUG = True
SECRET_KEY = 'l%3ya7fn3moipdpcltj(tdfcv5^@lj=t5d&72levvls+y*@_4^'
SQLALCHEMY_DATABASE_URI = 'mysql://root:root@127.0.0.1:3306/flaskdb'
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
SQLALCHEMY_TRACK_MODIFICATIONS = True
以上几项配置是链接数据库必须的配置,其中SQLALCHEMY_DATABASE_URI就是链接mysql数据库的url,第一个root是用户名,冒号后的root是密码,3306是mysql数据库默认的端口号,最后一个flaskdb则是数据库名
接下来修改我们的工厂函数如下所示:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from RealProject.settings import BASE_DIR
db = SQLAlchemy()
def create_app(test_config=None):
app = Flask(__name__, instance_relative_config=True)
if test_config is None:
CONFIG_PATH = BASE_DIR / 'RealProject/settings.py'
app.config.from_pyfile(CONFIG_PATH, silent=True)
else:
# test_config为一个字典
app.config.from_mapping(test_config)
db.init_app(app)
# 递归创建目录,确保项目文件存在
try:
os.makedirs(app.instance_path)
except OSError:
pass
from app.blog import views as blog
app.register_blueprint(blog.bp)
return app
from app.blog import models
做完以上步骤,如果你的数据库没有问题的话,就已经可以连接到数据库了,但是字段此时还并没有同步到数据库,同步字段到数据库的方法是,进入Flask的shell环境,运行以下两个命令即可:
>>> from RealProject import db
>>> db.create_all()
但是,要进入Flask的shell环境需要先在终端设置项目的环境变量,我这里以Windows系统和本项目为例:
CMD终端,运行如下命令,即可进入shell环境
> set FLASK_APP=RealProject
> set FLASK_ENV=development
> flask shell
Powershell终端, 运行如下命令,即可进入shell环境
> $env:FLASK_APP = "RealProject"
> $env:FLASK_ENV = "development"
> flask shell
但是,我们不采用这种方法去同步数据库,下一章我们将采用Flask的另外一个扩展Flask-Migrate来同步数据库,他可以进行数据库的版本控制,列如你数据库某些字段已经有了默认数据,他不会去清空重建,而是会进行新增操作,类似于django的makemigrations和migrate两个命令所做的事情!
其他章节
- Flask博客开发实战 – 前言
- Flask博客开发实战 – 配置环境并安装Flask
- Flask博客实战 – 快速上手
- Flask博客实战 – 目录结构
- Flask博客实战 – 工厂函数
- Flask博客实战 – 蓝图应用
- Flask博客实战 – Flask-SQLAlchemy的使用
