1,flask-migrate介绍:

  因为采用db.create_all()在后期修改字段的时候不会自动的映射到数据库中,必须删去表,然后运行,所以我们用flask-migrate来映射。

db.create_all()才会重新映射,这样不符合我们的需求,因此flask-migrate就是为了解决这个问题,他可以在
每次修改模型后,可以将修改的东西映射到数据库中。

2,如下图,当用户请求服务器时,那flask服务器会将当前app推入app栈中,所以当用“db.init_app(app)”的“db”的变量(这个db可以初始化很多app,所以得具体指定出当前app,这时候需要入栈),他就会从栈里去取栈顶的元素,拿到之后再给他初始化。当没有用户访问服务器时,相当于没执行视图函数,即app没放在app栈中,这时候读取的就是空的东西,
“with app.app_context():

db.create_all()”相当于手动入栈的过程。

结果对比:

那么这和我们的迁移有什么关系呢?

请看下面的问题:

我想在下面的模型里加一个字段telephone:

from exts import db

class Author(db.Model):
__tablename__ = "author"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(),nullable=False)

那么我直接在下面加再运行代码会出问题,因为已经生成的数据模型不能再更改,所以这里需要用到数据迁移:

在model中添加telephone后在迁移并映射后变为:

代码:

app.py
from flask import Flask
from models import Author
from exts import db
import config app = Flask(__name__)
app.config.from_object(config)
db.init_app(app) # db.create_all() # with app.app_context():
# db.create_all()
# migrate步骤2:
# 当manage.py/“migrate步骤”中执行后,上面两句就可以不要了。 @app.route('/')
def hello_world():
return 'Hello World!' if __name__ == '__main__':
app.run()
exts.py
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy()
models.py
from exts import db class Author(db.Model):
__tablename__ = "author"
id = db.Column(db.Integer,primary_key=True,autoincrement=True)
name = db.Column(db.String(),nullable=False)
# migrate步骤3:
telephone = db.Column(db.String(),nullable=False)

migrate.py
from flask_script import Manager
from app import app
from exts import db
from flask_migrate import Migrate,MigrateCommand
from models import Author # migrate步骤1:
# 模型 --> 迁移 --> 表,分别用下面语句实现
# “python manage.py db init” --> “python manage.py db migrate” --> “python manage.py db upgrade”
# 作用分别是1,初始化一个迁移环境。,做出一个迁移表。,映射成表。 # migrate步骤4:
# “python manage.py db migrate” --> “python manage.py db upgrade” manager = Manager(app) migrate = Migrate(app,db) manager.add_command("db",MigrateCommand) if __name__ == '__main__':
manager.run()
config.py
# encoding:utf-
#dialect+driver://username:password@host:port/database
# dialect:是数据库的实现,比如MySql,SQLlite,且转换为小写
# driver:对应的驱动,比如MySql的驱动是MySqldb
# username:连接数据库的用户名
# password:密码
# host:连接数据库的域名
# port:数据库监听的端口号
# database:是连接的数据库的名字,创建数据库语句为:
"""create database db_demo1(database_name) charset utf8;""" # 如果以上输出了1则说明SQLAlchemy能成功连接到数据库。 DIALECT = "mysql"
DRIVER = "mysqldb"
USERNAME = "root"
PASSWORD = ''
HOST = "127.0.0.1"
PORT = ""
DATABASE = "db3" SQLALCHEMY_DATABASE_URI="{}+{}://{}:{}@{}:{}/{}".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
"""指定一个名为SQLALCHEMY_DATABASE_URI的固定变量,注意是固定的写法"""
SQLALCHEMY_TRACK_MODIFICATIONS =False

06flask_migrate的更多相关文章

随机推荐

  1. Aplcloud中 openFrame 和 openWin 的区别

    WIn 占满一屏,但不能设置大小, Frame 可以 一般情况 Frame 依附于win 之上,关了window 通过window打开的frame 也会关闭.

  2. robotframework导入测试库使用方法

    1.新建一个测试库 course_mgr.py,存在一个函数listCourse 2.新建RF测试用例使用listCourse关键字 导入测试库如下方式 course_mgr若存在上级目录,则需要加上 ...

  3. C# 创建Web项目时 可以选择的类型在不同VS版本下的对比

    上面这个界面应该是 vs2010的 一. VS2012 .VS2013 其实每个模板的意思,在右边已经显示出来了.Empty,就是一个空的模板,创建后里面除了一个web.config外什么都没有:We ...

  4. c++ 常用头文件

    1.#include<iostream> iostream 的意思是输入输出流.#include<iostream>是标准的C++头文件,任何符合标准的C++开发环境都有这个头 ...

  5. 从输入URL到浏览器显示页面发生了什么

    1.输入网址 当你开始输入网址比如www.cnblogs.com时游览器就可以在书签或者历史记录里面去搜索相关的网址推荐给你. 2.游览器查找域名的IP地址 ① 请求发起后,游览器首先会解析这个域名, ...

  6. zip4j实现文件压缩与解压缩 & common-compress压缩与解压缩

    有时候需要批量下载文件,所以需要在后台将多个文件压缩之后进行下载. zip4j可以进行目录压缩与文件压缩,同时可以加密压缩. common-compress只压缩文件,没有找到压缩目录的API. 1. ...

  7. Maven - 镜像<mirror>

    使用镜像如果你的地理位置附近有一个速度更快的central镜像,或者你想覆盖central仓库配置,或者你想为所有POM使用唯一的一个远程仓库(这个远程仓库代理的所有必要的其它仓库),你可以使用set ...

  8. Reinforcement Learning Solutions Ed2 Chapter 1 - 2 问题解答

    RL到了第三章题目多的不可思议 前两章比较简单,就在博客随便写写了.之后的用pdf更新. 1.1: Self-play will result different move even from the ...

  9. 20175204 张湲祯 2018-2019-2《Java程序设计》2

    20175204 张湲祯 2018-2019-2<Java程序设计>2 必做课下作业MyCP 要求 编写MyCP.java 实现类似Linux下cp XXX1 XXX2的功能,要求MyCP ...

  10. BFS 模拟队列(水题)

    BFS 这道题 觉得比较适合BFS新手入门写,也许大家都以为最入门 的BFS题是在二维图上搜索,但是这道题是线性搜索,更加简单 POJ 3278 Catch That Cow Time Limit:  ...