好文档 - 专业文书写作范文服务资料分享网站

Flask 入门系列教程(五)

天下 分享 时间: 加入收藏 我要投稿 点赞

既然是应用程序,那么数据库就是必不可少的一部分。数据库按照一定规则保存程序数据,程序再发起查询取回所需的数据。Web 程序最常用基于关系模型的数据库,这种数据库也称为 SQL 数据库,因为它们使用结构化查询语言。不过最近几年文档数据库和键值对数据库成了流行的替代选择,这两种数据库合称 NoSQL数据库,比如 redis 等等。

Flask 中的数据库框架

每一种语言,都有对应的比较完善的数据库框架,这些框架可以帮助我们更加方便的进行数据库操作,从而屏蔽掉相关的具体 SQL 语句,也可以防止 SQL 注入等安全隐患。Python 当然不例外,可以通过 ORM 来把底层 SQL 转换成 Python 对象,这样一来,我们甚至不需要了解 SQL,只通过 Python 代码就可以完成数据库操作。

而在 Flask 当中,就有这么一个插件,可以非常方便的操作数据库:Flask-SQLAlchemy

Flask-SQLAlchemy

Flask-SQLAlchemy 是一个 Flask 扩展,简化了在 Flask 程序中使用 SQLAlchemy 的操作。

SQLAlchemy 是一个很强大的关系型数据库框架,支持多种数据库后台。SQLAlchemy 提供了高层 ORM,也提供了使用数据库原生 SQL 的低层功能。和其他大多数扩展一样,Flask-SQLAlchemy 也使用 pip 安装: pip install flask-sqlalchemy

在 Flask-SQLAlchemy 中,数据库使用 URL 指定。最流行的数据库引擎采用的数据库 URL 格式如下所示

这里的 URL 必须是保存在 Flask 对象 SQLALCHEMY_DATABASE_URI 键中,配置对象中还有一个很有用的选项,即

SQLALCHEMY_COMMIT_ON_TEARDOWN 键,将其设为 True 时,每次请求结束后都会自动提交数据库中的变动。

下面就是配置数据库的代码

from flask_sqlalchemy import SQLAlchemy

basedir = os.path.abspath(os.path.dirname(__file__))

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, '

data.sqlite')

app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True db = SQLAlchemy(app)

db 对象是 SQLAlchemy 类的实例,表示程序使用的数据库,同时还获得了 Flask-SQLAlchemy提供的所有功能。

定义模型

模型这个术语表示程序使用的持久化实体。在 ORM 中,模型一般是一个 Python 类,类中的属性对应数据库表中的列。

Flask-SQLAlchemy 创建的数据库实例为模型提供了一个基类以及一系列辅助类和辅助函数,可用于定义模型的结构。

下面我们定义一个 User 模型 class Role(db.Model): __tablename__ = 'roles'

id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True)

class User(db.Model): __tablename__ = 'users'

id = db.Column(db.Integer, primary_key=True)

username = db.Column(db.String(64), unique=True, index=True)

在这里,类变量 __tablename__ 用于定义表名,表中列的属性由 db.Column 来定义

下面是一些常用的列类型

下面是一些常用的列选项

表关系

在我们当前的数据模型下,角色与用户是一对多的关系,一个角色可以属于多个用户,而一个用户只可以是一个角色。下面我们修改下上面定义的两个模型

class Role(db.Model): __tablename__ = 'roles'

id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(64), unique=True) users = db.relationship('User', backref='role')

class User(db.Model): __tablename__ = 'users'

id = db.Column(db.Integer, primary_key=True)

username = db.Column(db.String(64), unique=True, index=True) role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

db.relationship() 中的 backref 参数向 User 模型中添加一个 role 属性,从而定义反向关系。这一属性可替代 role_id 访问 Role 模型,此时获取的是模型对象,而不是外键的值。

添加到 User 模型中的 role_id 列被定义为外键,就是这个外键建立起了关系。传递 db.ForeignKey() 的参数 'roles.id' 表明,这列的值是 roles 表中行的 id 值。

数据库操作

下面我们看下如何进行数据库的相关操作,我们在 Python shell 中实际操作下

创建数据库

要注意,我们这里是使用的是最新的 flask 版本,所以是自带了 shell 命令的,直接执行 flask shell 命令

#####:HelloFlask edisonvera$ flask shell /usr/local/lib/python3.6/site-packages/flask_sqlalchemy/__init__.py:834: FSADeprecationWarning: SQLALCHEMY_TRACK_MODIFICATIONS adds significant overhead and will be disabled by

80e6p1kmqq6o2vt5lzj67d82u9zjet00ihu
领取福利

微信扫码领取福利

微信扫码分享