Toc
  1. 数据库
    1. 写在前面
      1. 一款不错的SQL模型绘制工具
        1. 安装位置
        2. 打开方式
        3. 使用方式
      2. SQLAlchemy(炼金术)介绍 [ˈælkəmi]
      3. Migrate(迁移)简介[maɪˈɡreɪt]
      4. 一些数据库术语
        1. ORM
        2. VARCHAR
    2. Flask-SQLAlchemy配置
      1. 新的config.py
      2. SQLALCHEMY_DATABASE_URI
      3. SQLALCHEMY_TRACK_MODIFICATIONS
    3. 初始化数据库和数据库迁移引擎
    4. 数据库模型
      1. 一张样例图
      2. 样例解析
        1. id、主键
        2. VARCHAR
        3. password_hash
      3. 样例的代码实现
      4. 代码解析
        1. User类、db.Model
      5. __repr__方法
    5. 创建数据库迁移数据库
      1. 命令
        1. 关于flask命令的注意点
    6. 第一次数据迁移
      1. 生成迁移脚本
        1. 效果
      2. 更改升级的应用到数据库
        1. 效果
    7. 数据库升级和降级流程
Toc
0 results found
魏敬杨
【Flask_tips3】数据库
2019/12/06 flask

数据库

写在前面

一款不错的SQL模型绘制工具

安装位置

D:\Program Files\wwwsqldesigner

打开方式

在安装位置使用Nodejs的一个命令http-server(应该算是安装的一个插件吧)

使用方式

几乎完全不会

SQLAlchemy(炼金术)介绍 [ˈælkəmi]

SQLAlchemy不只是某一款数据库软件的ORM,而是支持包含MySQLPostgreSQLSQLite在内的很多数据库软件。简直是太强大了,你可以在开发的时候使用简单易用且无需另起服务的SQLite,需要部署应用到生产服务器上时,则选用更健壮的MySQL或PostgreSQL服务,并且不需要修改应用代码(译者注:只需修改应用配置)。

Migrate(迁移)简介[maɪˈɡreɪt]

这个插件是Alembic的一个Flask封装,是SQLAlchemy的一个数据库迁移框架。 使用数据库迁移增加了启动数据库时候的一些工作,但这对将来的数据库结构稳健变更来说,是一个很小的代价。

一些数据库术语

ORM

对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。

VARCHAR

数据库中的可变长度的字符串

Flask-SQLAlchemy配置

新的config.py

1
import os
2
basedir = os.path.abspath(os.path.dirname(__file__))
3
4
class Config(object):
5
    # ...
6
    SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
7
        'sqlite:///' + os.path.join(basedir, 'app.db')
8
    SQLALCHEMY_TRACK_MODIFICATIONS = False

SQLALCHEMY_DATABASE_URI

Flask-SQLAlchemy插件从SQLALCHEMY_DATABASE_URI配置变量中获取应用的数据库的位置。

SQLALCHEMY_TRACK_MODIFICATIONS

用于设置数据发生变更之后是否发送信号给应用,我不需要这项功能,因此将其设置为False

初始化数据库和数据库迁移引擎

1
db = SQLAlchemy(app)
2
migrate = Migrate(app, db)

数据库模型

一张样例图

用户表

样例解析

id、主键

id字段通常存在于所有模型并用作主键。每个用户都会被数据库分配一个id值,并存储到这个字段中。大多数情况下,主键都是数据库自动赋值的,我只需要提供id字段作为主键即可。

VARCHAR

usernameemailpassword_hash字段被定义为字符串(数据库术语中的VARCHAR),并指定其最大长度,以便数据库可以优化空间使用率。

password_hash

不使用明文密码,而使用哈希密码,提高安全性

样例的代码实现

1
from app import db
2
3
class User(db.Model):
4
    id = db.Column(db.Integer, primary_key=True)
5
    username = db.Column(db.String(64), index=True, unique=True)
6
    email = db.Column(db.String(120), index=True, unique=True)
7
    password_hash = db.Column(db.String(128))
8
9
    def __repr__(self):
10
        return '<User {}>'.format(self.username)

代码解析

User类、db.Model

上面创建的User类继承自db.Model,它是Flask-SQLAlchemy中所有模型的基类。 这个类将表的字段定义为类属性,字段被创建为db.Column类的实例,它传入字段类型以及其他可选参数,例如,可选参数中允许指示哪些字段是唯一的并且是可索引的,这对高效的数据检索十分重要。

__repr__方法

该类的__repr__方法用于在调试时打印用户实例。

创建数据库迁移数据库

命令

flask db init

flask db 是Flask-Migrate添加的用来管理和迁移数据库的相关事情的子命令

关于flask命令的注意点

flask 命令依赖于 FLASK_APP 环境变量来知道Flask应用入口在哪里。

可以在终端上用 set FLASK_APP=microblog.py 来配置

第一次数据迁移

生成迁移脚本

flask db migrate -m”user table”

效果

生成了一个迁移脚本,位于microblog/migration/versions/eb69….py(文件名为用于迁移的唯一标识)

内部包含upgrade()和dowmgrade()两个函数

更改升级的应用到数据库

flask db upgrade

效果

当upgrade命令检测到SQLite不存在时,会创建一个app.db,即SQLite数据库

在使用类似MySQL和PostgreSQL的 数据库服务时,必须在运行 upgrade 之前在数据库服务器上创建数据库。

数据库升级和降级流程

通过数据库迁移机制的支持,在你修改应用中的模型之后,将生成一个新的迁移脚本( flask db migrate ),你可能会审查它以确保自动生成的正确性,然后将更改应用到你的开发数据库( flask db upgrade )。 测试无误后,将迁移脚本添加到源代码管理并提交。

当准备将新版本的应用发布到生产服务器时,你只需要获取包含新增迁移脚本的更新版本的应用,然 后运行 flask db upgrade 即可。 Alembic将检测到生产数据库未更新到最新版本,并运行在上一版 本之后创建的所有新增迁移脚本。

flask db downgrade 命令可以回滚上次的迁移。

本文作者:魏敬杨
版权声明:本文首发于魏敬杨的博客,转载请注明出处!