首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

学习python flask之四:介绍flask-SQLAlchemy和flask-migrate

数据库非常重要。对于大多数应用来说,永久保存数据并且高效存取,都是一个基本的需求。因此数据库部分将分两次发布。本文重点介绍flask-SQLAlchemy和flask-migrate这两个flask扩展模块。

你肯定听说过,flask不能原生的支持数据库。实际上这是flask故意不支持的几个领域中的一个,但这也可以说是flask的优点,因为你能自由的选择一个最适合你的数据库。

python中的数据库有很多选择,很多数据库都有相应的flask扩展,这使得他们可以与应用更好的整合。数据库可以分成两个大类,关系数据库和非关系数据库。后者常被称为NoSQL,表示他们不支持常见的关系查询语言SQL。一般来说,关系数据库适合需要存取结构体的数据库,而非关系数据库更适合更少结构体的数据库。实际上大多数应用存储的数据都可以组成结构体,因此关系数据库应用更广泛。

为了用好数据库,需要用到两个flask扩展模块。第一个就是Flask-SQLAlchemy,这个扩展提供了flask友好的封装,它所封装的SQLAlchemy包是对象关系映射器(Ojbect Relational Mapper,简称ORM)。ORM允许应用使用high-level实体,例如类、对象和方法来代替表和SQL。ORM的工作是翻译这些high-level的操作成为数据库命令。并且SQLAlchemy可以支持多种关系数据库,包括MySQL,PostgreSQL和SQLite。这样你就可以在开发时使用SQLite数据库,然后作为产品应用时可以替换成MySQL或者PostgerSQL,这不需要修改应用。安装Flask-SQLAlchemy很简单,允许下列命令即可:

pip install flask-sqlalchemy

数据库迁移

很多数据库的教程都仅仅包括创建数据库和使用数据库,但不包括数据库迁移。数据库迁移在应用服务的客户越来越多时或者需求发生变化时很有必要,但是迁移往往很难,因为关系数据库的核心时数据结构,当数据结构变化时,已经存在数据库中的数据需要迁移到修改后的结构体上。因此我们需要用到的第二个flask扩展是flask-migrate,这个扩展是一个Alembic的flask扩展。Alembic是用于SQLAlchemy的数据库迁移框架。我们需要花点时间来支持数据库的迁移,但这点代价会换来你修改数据库时的健壮的方法。安装这个扩展也很简单:

pip install flask-migrate

数据库配置

开发中,我们将使用SQLite数据库,因为它简单,而且不需要运行数据库服务器。我们需要在config.py中添加如下代码:

Flask-SQLAlchemy扩展使用SQLALCHEMY_DATABASE_URI作为应用的数据库的位置,并使用DATABASE_URL作为数据库的URL,如果没有定义,我就配置一个缺省的app.db在应用的基地址basedir。

SQLALCHEMY_TRACK_MODIFICATIONS设置为flase,一般不需要跟踪数据库的变化,除非是在debug的时候。

数据库在应用中表示为数据库实例,数据库迁移引擎也有一个实例。这些对象都需要在app创建之后使用。

这里除了创建了db对象外,还创建了migtate对像,最后还import了models,这个模块用来定义数据库的结构。

数据库模型

储存在数据库中的数据会被表示成多个类,通常称为数据库模型。ORM层负责类到数据库结构的翻译。现在我们来创建一个模型来表示用户。设计数据库可以用网上的工具http://ondras.zarovi.cz/sql/demo/。使用该工具设计的用户模型如下:

id域是主键,一般在添加数据时自动加1。其他三个域都定义称字符串。这里密码使用hash值而不是密码本省,是一种常见的安全措施。

这里__repr__方法告诉python如何打印类的对象,这在debug时很有用。

创建迁移仓库

Alembic维护一个迁移仓库,其中储存这迁移脚本。每次修改数据库策略,一个迁移脚本都会加入仓库来表面数据库策略的变化。这些迁移脚本都是按顺序储存的。flask db可以用来管理数据迁移相关的任何变化。

注意flask命令是基于FLASK_APP这个环境变量的,因此需要设置FLASK_APP=microblog.py。

falsk db migrate可以用来完成数据库迁移。

flask db migrate命令不改变数据库,它只是产生迁移脚本,要想把这些改变应用到数据库,需要用到flask db upgrade命令:

由于应用采用了SQLite, upgrade命令会检测到数据库并不存在,它就会创建一个,默认为app.db。当你采用Mysql和PostgreSQL时,你必须现在数据库服务器上创建数据库,然后再运行upgrade命令,数据库的内容就会自动创建。由此可见迁移过程无需开发者参与。

下一次再介绍microblog中对这两个扩展的具体应用。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180228A09HE300?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券