Flask之数据库使用
1. Flask 中的数据库
使用 Flask-SQLAlchemy 扩展来管理应用程序的数据。这个扩展封装了SQLAlchemy项目,这是一个 对象关系映射器或者ORM。
2. 数据库迁移
使用 SQLAlchemy-migrate 来跟踪数据库的更新。它只是在开始建立数据库的时候多花费些工作.
SQLAlchemy-migrate 包自带命令行和 APIs,这些 APIs 以一种将来允许容易升级的方式来创建数据库。
一个空的 sqlite 数据库,创建一开始就支持迁移。同样你还将有一个 db_repository 文件夹,里面还有一些文件,这是 SQLAlchemy-migrate 存储它的数据文件的地方。
请注意,我们不会再生的存储库,如果它已经存在。这将使我们重新创建数据库,同时保留现有的存储库,如果我们需要。
SQLAlchemy-migrate 迁移的方式就是比较数据库(在本例中从 app.db 中获取)与我们模型的结构(从文件 app/models.py 获取)。两者间的不同将会被记录成一个迁移脚本存放在迁移仓库中。迁移脚本知道如何去迁移或撤销它,所以它始终是可能用于升级或降级一个数据库。
在使用脚本自动地完成迁移的时候也不是没有问题的,有时候它很难识别新老格式的变化。为了让 SQLAlchemy-migrate 容易地识别出变化,绝不要重命名存在的字段,仅限于增加或者删除模型或者字段,或者改变已存在字段的类型。当然我一直会检查生成的迁移脚本,确保它是正确。
不应该在没有备份下去尝试迁移数据库。当然也不能在生产环境下直接运行迁移脚本,必须在开发环境下确保迁移运转正常。
3. 数据库配置
小型的应用,采用 sqlite 数据库。sqlite 数据库是小型应用的最方便的选择,每一个数据库都是存储在单个文件里。大型的可以采用MySql.
SQLALCHEMY_DATABASE_URI 是 Flask-SQLAlchemy 扩展需要的。这是数据库文件的路径。
SQLALCHEMY_MIGRATE_REPO 是文件夹,把 SQLAlchemy-migrate 数据文件存储在这里。
4. 数据库模型
存储在数据库中数据将会以类的集合来表示,称之为数据库模型。ORM 层需要做的翻译就是将从这些类创建的对象映射到适合的数据库表的行.
5. 数据库升级和回退
假设有一个应用程序在开发机器上,同时有一个拷贝部署在到线上的生产机器上。在下一个版本中,你的数据模型有一个变化,比如新增了一个表。如果没有迁移脚本,可能必须要琢磨着如何修改数据库格式在开发和生产机器上,这会花费很大的工作。
如果有数据库迁移的支持,当准备发布新版的时候,只需要录制一个新的迁移,拷贝迁移脚本到生产服务器上接着运行脚本,所有事情就完成了。数据库升级也只需要一点 Python 脚本(文件 db_upgrade.py):
当你运行上述脚本的时候,数据库将会升级到最新版本。
通常情况下,没有必要把数据库降低到旧版本,但是,SQLAlchemy-migrate 支持这么做(文件 db_downgrade.py)
这个脚本会回退数据库一个版本。你可以运行多次来回退多个版本。