一、概念理解
ORM(Object Relationnal Mapping) 对象映射关系,简单来说,就是不在数据库里直接进行操作,而是在项目开发里完成数据库的增删改查操作,将面向对象语言程序中的对象自动持久化到关系数据库中。
SQLAlchemy是flask框架的插件,用于连接数据库的工具
二、操作步骤
-
安装SQLAlchemy插件:
pip install flask_sqlalchemy导入:from flask_sqlalchemy import SQLAlchemy -
连接数据库格式(以mysql为例,连接不同数据库有不同的格式要求,应具体情况具体分析):
mysql+pymysql://用户名:密码@数据库IP:端口/数据库名?charset=utf8
eg.SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:[email protected]:3306/myblog?charset=utf8' -
定义数据库模型(model)
通过定义一个类来设计数据库模型,完成数据表(包括字段、外键、主键等)的设计,常用 的字段类型有Integer、String、DataTime、Boolean,例子如下:
需要注意几点:
(1)类的属性名默认为字段名
(2)类名的小写默认对应数据库表名,也可以指定表明,__tablename__
(3)熟记字段的几个属性: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()等,具体方法怎么用自己查哈,这里只是给出一个知识框架User.query.filter_by(username='Susan').first()
(3)Update更新
直接赋值给字段属性就可以改变字段值,然后调用db.session.commit()
(4)Delete删除
跟增加差不多,把add(),改为delete(),eg .db.session.delete(user)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()
-
多对多。两表之间无法直接建立外键和关系属性,需要额外添加一个关联表来处理。关联表不存储数据,只用来存储关系两侧模型的外键对应关系。