Flask Web 开发学习笔记(六)
本文主要介绍如何使用 Flask 操作数据库。
数据库按照一定规则保存程序数据,程序再发起查询取回所需的数据。Web 程序最常用基于关系模型的数据库,这种数据库也称为 SQL 数据,因为它们使用结构化查询语句。不过最近几年文档数据库和键值对数据库成了流行的替代选择,这两种数据库合称为 NoSQL 数据库。
大多数的数据库引擎都有对应的 Python 包,包括开源包和商业包。Flask 并不限制你使用何种类型的数据库包,因此可以根据自己的喜好选择使用 MySQL、Postgres、SQLite,Redis、MongoDB 或者 CouchDB。
如果这些都无法满足需求,还有一些数据库抽象层代码包供选择,例如 SQLAlchemy 和 MongoEngine 。你可以使用这些抽象包直接处理高等级的 Python 对象,而不用处理如表、文档或查询语言此类的数据库实体。
选择框架时,你不一定非得选择已经集成了 Flask 的框架,但选择这些框架可以节约你编写集成代码的时间。使用集成了 Flask 的框架可以简化配置和操作,所以专门为 Flask 开发的扩展是你的首选。
关于选择使用的数据库框架,选择的是 Flask-SQLAlchemy。
安装 Flask-SQLAlchemy
|
|
配置 Flask-SQLAlchemy
在 Flask-SQLAlchemy 中,数据库使用 URL 指定。
MySQL : mysql://username:password@hostname/database
Postgres : postgresql://username:password@hostname/database
SQLite : sqlite:////absolute/path/to/database
在这些 URL 中,hostname 表示 MySQL 服务所在的主机,可以是本地主机(localhost),也可以是远程服务器。数据库服务器上可以托管多个数据库,因此 database 表示要使用的数据库名。如果数据库需要进行认证,username 和 password 表示数据库的用户名和密码。
SQLite 数据库不需要使用服务器,因此不用指定 hostname、username 和 password。 URL 中的 database 是硬盘上文件的文件名。
程序使用的数据库URL必须保存到 Flask 配置对象的 SQLALCHEMY_DATABASE_URI
键中。配置对象中还有一个很有用的选项,即 SQLALCHEMY_COMMIT_ON_TEARDOWN
键,将其设置为 True
时,每次请求结束后都会自动提交数据库中的变动。
我们使用 SQLite 数据库,配置代码 如下:
|
|
定义模型
定义一个用户表 users 和一个角色表 roles,代码如下:
|
|
解释下:
0.两个类
User
和Role
继承自db.Model
1.__tablename__
用来指定表名称
2.db.Column()
函数指定了数据库中字段的类型,是否是主键(primary_key
),是否唯一(unique
),是否加索引(index
),还有其他的比如:是否可以为空(nullable=True
),默认值(default
)
关系
使用关系型数据库,不指定关系怎么能行。定义模型中我们没有指定关系,一个用户有一个角色,一个角色可以属于多个用户,典型的一对多的关系,如何在 Flask-SQLAlchemy 中定义关系?
上代码:
|
|
添加了两行代码:
第一行 User
类中:
|
|
这句话比较好理解,和上面普通变量差不多,就是 User
类中添加了一个 role_id
变量,数据类型 db.Integer
,第二个参数指定外键是哪个表中哪个 id
。
第二行 Role
类中:
|
|
这句话比较复杂,仔细读下面的话:
0.添加到
Role
模型中的users
属性代表这个关系的面向对象视角。对于一个Role
类的实例,其users
属性将返回与角色相关联的用户组成的列表。
1.db.relationship()
第一个参数表明这个关系的另一端是哪个模型(类)。如果模型类尚未定义,可使用字符串形式指定。
2.db.relationship()
第二个参数backref
,将向User
类中添加一个role
属性,从而定义反向关系。这一属性可替代role_id
访问Role
模型,此时获取的是模型对象,而不是外键的值。
上面的关系为一对多关系的表示,一对一怎么办?
调用 db.relationship()
时需要把 uselist
参数设置为 False
。如下:
|
|
至于多对多关系,以后会慢慢介绍。
数据库操作
数据库操作,基本的一些:数据库、表创建或删除,数据的增删改查。
创建数据库和表
|
|
上面说的 users 表和 roles 表就创建了。
删除数据库
|
|
插入行
|
|
通过数据库会话管理对数据库所做的改动,在 Flask-SQLAlchemy 中,会话由db.session
表示,准备把队形写入数据库之前,先要将其添加到会话中。写入数据库需要调用 db.session.commit()
方法。
修改行
|
|
删除行
|
|
查询行
|
|
更多相关方面文档请参考: SQLAlchemy 文档