2)获取帮助,在pycharm的控制台中输入 flask db  --help,或者flask db migrate  --help,这样就可以了解各个命令的信息了
3)一般用法,
    >flask db init
    >flask db migrate
    >flask db upgrade
    后续对脚本有任何的修改,只要重复执行后两句就可以了。
 
4)测试1:添加一行数据,删除email列,然后再加上
    针对下面这个表:
 
 class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(64),index=True,unique=True)
email = db.Column(db.String(120),index=True,unique=True)
password_hash = db.Column(db.String(128)) def __repr__(self):
return '<用户名:{}>'.format(self.username)
 
 
    a)先通过以上3个命令创建表;
    b)然后再数据库中插入一条数据;
    c)然后从models中把email列删除,执行migrate ,updrade,此时发现,数据还在,只是列删除了;
    d)然后恢复email列,执行migrate,upgrade,此时发现,数据还在,增加了一个email的空列;
    仔细观察日志,发现这个upgrade执行的是升级,而不是重新创建
 
INFO  [alembic.runtime.migration] Running upgrade 04a26df9c6d3 -> 04f13e3c2f7e, empty message
 
 
其中04a26df9c6d3_.py的内容为:
 
 

 """empty message
Revision ID: 04a26df9c6d3
Revises: 4ed84444672c
Create Date: 2018-08-29 07:14:44.779039
"""
from alembic import op
import sqlalchemy as sa # revision identifiers, used by Alembic.
revision = '04a26df9c6d3'
down_revision = '4ed84444672c'
branch_labels = None
depends_on = None def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index('ix_user_email', table_name='user')
op.drop_column('user', 'email')
# ### end Alembic commands ### def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('user', sa.Column('email', sa.VARCHAR(length=120), autoincrement=False, nullable=True))
op.create_index('ix_user_email', 'user', ['email'], unique=True)
# ### end Alembic commands ###
 
 
 
04f13e3c2f7e_.py 的内容为
 """empty message

 Revision ID: 04f13e3c2f7e
Revises: 04a26df9c6d3
Create Date: 2018-08-29 07:19:33.876815 """
from alembic import op
import sqlalchemy as sa # revision identifiers, used by Alembic.
revision = '04f13e3c2f7e'
down_revision = '04a26df9c6d3'
branch_labels = None
depends_on = None def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('user', sa.Column('email', sa.String(length=120), nullable=True))
op.create_index(op.f('ix_user_email'), 'user', ['email'], unique=True)
# ### end Alembic commands ### def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_user_email'), table_name='user')
op.drop_column('user', 'email')
# ### end Alembic commands ###
 
 
 
 
5)测试2:把user表删除
    a)如果只执行flask db upgrade,则什么都不执行

(venv) D:\WORK\gitbase\HelloFlask>flask db upgrade
INFO  [alembic.runtime.migration] Context impl PostgresqlImpl.
INFO  [alembic.runtime.migration] Will assume transactional DDL.
 
 
    b)执行flask db migrate,然后再执行flask db upgrade,则可以重新创建表
    通过migrate,程序会先比较本地的model和数据库中实际的表,然后创建如下脚本 69f5e753ee6c_.py
 """empty message

 Revision ID: 69f5e753ee6c
Revises: 04f13e3c2f7e
Create Date: 2018-08-29 07:31:19.236320 """
from alembic import op
import sqlalchemy as sa # revision identifiers, used by Alembic.
revision = '69f5e753ee6c'
down_revision = '04f13e3c2f7e'
branch_labels = None
depends_on = None def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('user',
sa.Column('id', sa.Integer(), nullable=False),
sa.Column('username', sa.String(length=64), nullable=True),
sa.Column('email', sa.String(length=120), nullable=True),
sa.Column('password_hash', sa.String(length=128), nullable=True),
sa.PrimaryKeyConstraint('id')
)
op.create_index(op.f('ix_user_email'), 'user', ['email'], unique=True)
op.create_index(op.f('ix_user_username'), 'user', ['username'], unique=True)
# ### end Alembic commands ### def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_index(op.f('ix_user_username'), table_name='user')
op.drop_index(op.f('ix_user_email'), table_name='user')
op.drop_table('user')
# ### end Alembic commands ###
 
6)结论
    对模型的任何修改,都要再执行flask db migrate, flask db upgrade
    这里做的任何的更新,实际上都是把模型和数据库当前的状态做比较的
    而且历次的版本都有,所以实际上可以回退到之前的任何一个版本。
    
    这个思路其实挺好,这就是我们之前写数据库补丁脚本的思路,一环套一环,只不过之前是靠人的,现在是靠程序自动生成的。
    而且他这里更好的地方是,不但支持upgrade,还支持downgrade

Python学习笔记:Flask-Migrate基于model做upgrade的基本原理的更多相关文章

  1. Deep learning with Python 学习笔记(10)

    生成式深度学习 机器学习模型能够对图像.音乐和故事的统计潜在空间(latent space)进行学习,然后从这个空间中采样(sample),创造出与模型在训练数据中所见到的艺术作品具有相似特征的新作品 ...

  2. Deep learning with Python 学习笔记(9)

    神经网络模型的优化 使用 Keras 回调函数 使用 model.fit()或 model.fit_generator() 在一个大型数据集上启动数十轮的训练,有点类似于扔一架纸飞机,一开始给它一点推 ...

  3. Deep learning with Python 学习笔记(8)

    Keras 函数式编程 利用 Keras 函数式 API,你可以构建类图(graph-like)模型.在不同的输入之间共享某一层,并且还可以像使用 Python 函数一样使用 Keras 模型.Ker ...

  4. Deep learning with Python 学习笔记(6)

    本节介绍循环神经网络及其优化 循环神经网络(RNN,recurrent neural network)处理序列的方式是,遍历所有序列元素,并保存一个状态(state),其中包含与已查看内容相关的信息. ...

  5. Deep learning with Python 学习笔记(3)

    本节介绍基于Keras的使用预训练模型方法 想要将深度学习应用于小型图像数据集,一种常用且非常高效的方法是使用预训练网络.预训练网络(pretrained network)是一个保存好的网络,之前已在 ...

  6. Deep learning with Python 学习笔记(2)

    本节介绍基于Keras的CNN 卷积神经网络接收形状为 (image_height, image_width, image_channels)的输入张量(不包括批量维度),宽度和高度两个维度的尺寸通常 ...

  7. Deep learning with Python 学习笔记(1)

    深度学习基础 Python 的 Keras 库来学习手写数字分类,将手写数字的灰度图像(28 像素 ×28 像素)划分到 10 个类别 中(0~9) 神经网络的核心组件是层(layer),它是一种数据 ...

  8. Python学习笔记总结

    目录 Python学习笔记总结 前言 安装 数据类型 Hello,World 变量 字符串 首字母大写 全部小写 全部大写 Tab和换行符 格式化 去除空格 List列表 列表增删改查排序 遍历列表 ...

  9. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

随机推荐

  1. Ansible 详解

    原文:https://www.cnblogs.com/keerya/p/7987886.html#_label0,有改动 一.Ansible简介 1.ansible是什么 a.ansible是新出现的 ...

  2. web移动端浮层滚动阻止window窗体滚动JS/CSS处理

    CSS代码: .noscroll, .noscroll body { overflow: hidden; } .noscroll body { position: relative; } JS代码: ...

  3. Spring事务的传播:PROPAGATION_REQUIRED

    PROPAGATION_REQUIRED-- 支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择. ServiceA { void methodA() { ServiceB.method ...

  4. vue的中vuex为何需要mutation更新状态,vue-router的路由的理解

    ); ); ); history.back(); history.forward(); // 修改历史,包括二个方法pushState.replaceState二个方法(objState,title, ...

  5. 00-JAVA语法基础--课后作业

    题目:像二柱子那样,花20分钟写一个能自动生成30道小学四则运算题目的“软件”. package 课堂作业1; import java.util.Random; import java.util.Sc ...

  6. 【LeetCode算法-14】Longest Common Prefix

    Write a function to find the longest common prefix string amongst an array of strings. If there is n ...

  7. ES6+javaScript原型

    Symbol 属性私有化,数据保护 let _gender = Symbol('gender') function Person(name, gender) { this.name = name; t ...

  8. Java数组常用方法

    数组基础:http://www.cnblogs.com/mengdd/archive/2013/01/04/2844264.html import java.util.Arrays; 1):创建数组 ...

  9. emitted value instead of an instance of error the scope attribute for scoped slots webpack babel polyfill

    api20180803.vue emitted value instead of an instance of error the scope attribute for scoped slots h ...

  10. Scrapy基础(四)————Scrapy的使用Pycharm进行Debuge设置

    好比Django的Debuge 与前端进行交互时的方便,但是Scrapy 不自带,所以我们写一个main文件来debuge 作用:通过cmd 命令启动爬虫 #-*-coding:utf-8 -*- # ...