文章目录
- 一、概念理解
- 二、操作步骤
- 三、定义关系
- 四、更新数据库表
- 五、总结
一、概念理解
数据库分为关系型数据库和泛指型数据库,典型的关系型数据库SQL有Oracle、SQLServer、MYSQL等,泛指型数据库NoSQL又分为用于存储实时消息的文档型数据库MongoDB、CoachDB和用于存储缓存的键值对型数据库Redis、Riak.
ORM(Object Relationnal Mapping) 对象映射关系,简单来说,就是不在数据库里直接进行操作,而是在项目开发中把底层的数据库实体转换为高层的python对象,通过对对象的一系列操作完成数据库的增删改查操作,将面向对象语言程序中的对象自动持久化到关系数据库中。
SQLAlchemy是flask框架的插件,用于连接数据库的工具,它的实例对象db=SQLAlchemy(app)
就是作为操控数据库的对象
二、操作步骤
- 安装SQLAlchemy插件:
pip install flask_sqlalchemy
导入:from flask_sqlalchemy import SQLAlchemy
- 连接数据库格式(以mysql为例,连接不同数据库有不同的格式要求,应具体情况具体分析):
mysql+pymysql://用户名:密码@数据库IP:端口/数据库名?charset=utf8
eg.SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:123456@localhost:3306/myblog?charset=utf8'
- 定义数据库模型(model)
通过定义一个类来设计数据库模型,完成数据表(包括字段、外键、主键等)的设计,表的字段由db.Colum类的实例来表示,字段类型用第一个参数表示,常用的字段类型有Integer、String、DataTime、Boolean,例子如下: - 需要注意几点:
(1)类与数据库表列的对应关系是:类--->表,类属性--->列,类实例对象--->行
(2)类名的小写默认对应数据库表名,也可以指定表明,__tablename__=‘’表名
(3)所有的表类都必须继承db.Model
(4)熟记字段的几个属性:id、primary_key、unique、index、default - 完成数据库的映射工作:初始化、迁移、更新
在项目程序中完成了对数据库的设计后,是时候更新到数据库中去了,主要分三个步骤:
(1)初始化:flask db init,首次生成数据库迁移文件
(2) 迁移:flask db migrate,完成数据库迁移的脚本工作
(3)更新:flask db upgrade,完成数据库的更新工作,此项操作如果数据库有可视化操作软件的话,可以直接看到变化,如没有的话通过输入命令也可以查询 - 数据库操作:CRUD 增删改查
(1)Create增加:
通过类的实例对象创建记录,添加新记录到数据库会话,提交数据库会话,eg. - (2)Read获取:
从数据库中获取相关数据,有这样的公式:<模型类>.query.<过滤方法>.<查询方法>
过滤方法可以获得更精确的查询,主要有filter、filter_by(以关键字表达式的方式)
查询方法主要包括all()、first()、one()、get()等,具体方法怎么用自己查哈,这里只是给出一个知识框架
eg.User.query.filter_by(username='Susan').first()
(3)Update更新
直接赋值给字段属性就可以改变字段值,然后调用db.session.commit()
(4)Delete删除
跟增加差不多,把add(),改为delete(),eg .db.session.delete(user)
db.session.commit()
*注意:*利用会话机制session进行数据库操作,db.sesssion.add(实例)将记录添加到会话缓存中,db.session.commit()将记录提交到数据库中去。
可以将CRUD的语句应用到视图函数中去。
三、定义关系
关系型数据库最重要的就是表与表之间的关系,在设计数据库的时候如果设计的好可以满足大部分的功能需求,所以有必要学好这块,数据库关系有一对多、多对多、多对一
- 一对多。在多的这边定义外键,在一的这边定义映射关系
(1)定义外键:用来在A表存储B表的主键值以便和B表建立联系的关系字段。eg.db.ForeignKey('author.id')
(2)定义映射关系。主要使用了db.relationship()函数,常用的SQLAlchemy关系函数参数有back_populates、back、lazy等。 - 多对一:外键和关系属性都定义在“多”这一侧。
eg.市民和城市属于多对一关系,在市民这边定义外键city_id,和关系“City” - 一对一。分别在两表之间建立关系属性db.relationship(),并随便在一方定义外键db.ForeignKey()
- 多对多。两表之间无法直接建立外键和关系属性,需要额外添加一个关联表来处理。关联表不存储数据,只用来存储关系两侧模型的外键对应关系。
四、更新数据库表
模型类不是一成不变的,发生如下情况时需要进行更新到数据库中去:
- 添加了新的模型类
- 在模型类添加了新的字段
- 在模型了修改了字段的名称或类型
操作方法:
- 先删除再创建。db.drop_all()再用db.create_all()。优点:简单直接,缺点:丢失数据库中的所有数据
- 采用数据库迁移工具Alembic,使用该工具可以在不破坏数据的情况下更新数据库表的结构。操作步骤如下:
(1)安装flask工具flask-migrate,使用Migrate类的实例化对象(传入程序实例对象app和数据库对象db作为参数)进行迁移
pip install flask-migrate
from flask-migrate import Migrate
migrate=Migrate(app,db)
(2)初始化迁移环境
在命令行下,输入命令:flask db init
(3) 生成迁移脚本
在命令行下,输入命令:flask db migrate -m '描述信息'
(4)更新数据库
在命令行下,输入命令:flask db upgrade
五、总结
到此为止,Flask框架数据库有关于SQLAlchemy的知识大概梳理了一遍,方便以后复习和查找时快速上手!