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. python excel写入及追加写入

    # -*- coding:utf-8 _*- """ @author:Administrator @file: excel.py Description :如果行数是10 ...

  2. HDU-6397(2018 Multi-University Training Contest 8) Character Encoding(生成函数+组合数学)

    题意 从$0$到$n-1$的数字里可重复的取至多$m$个数的和等于$k$的方案数. 思路 显然的生成函数的思路为构造 $(1+x+x^{2}+...+x^{n-1})^{m}$ 那么$x^{k}$的系 ...

  3. thrift安装及python和c++版本调试

    一.安装过程 1.安装依赖库 ]# yum install boost-devel-static libboost-dev libboost-test-dev libboost-program-opt ...

  4. C++关于string的一些用法

    #include <iostream> #include <algorithm> #include <functional> using namespace std ...

  5. 3D模型网站分享

    http://www.cgjoy.com/work.php  CG作品网 http://www.cgmxw.com/ CG模型王 http://www.cgmodel.cn/ CG模型网

  6. C++多态、虚函数、纯虚函数、抽象类、虚基类

    一.C++多态 C++的多态包括静态多态和动态多态.静态多态包括函数重载和泛型编程,动态多态包括虚函数.静态多态是指在编译期间就可以确定,动态多态是指在程序运行时才能确定. 二.虚函数 1.虚函数为类 ...

  7. WPF 10天修炼 第四天- WPF布局容器

    WPF布局 WPF的窗口也就是Window类,是一个内容控件,该控件派生自ContentControl.内容控件有一个Content属性,该属性有一个限制,只能放置一个用户界面元素,或一个字符串.为了 ...

  8. Python——字符串

    p ython——字符串 ①加法 连接两个字符串 ②乘法  复制字符串 python——转义字符 \n 换行 \' 单引号 \'' 双引号 \\ 反斜杠 raw字符串:无视转义字符   转义: 字符串 ...

  9. E - Coin Change UVA - 674 &&(一些记录路径的方法)

    这一道题并不难,我们只需要将dp数组先清空,再给dp[0]=1,之后就按照完全背包的模板写 主要是我们要证明着一种方法不会出现把(1+3+4)(1+4+3)当作两种方法,这一点如果自己写过背包的那个表 ...

  10. 理理Vue细节

    理理Vue细节 1. 动态属性名:可使用表达式来设置动态属性名或方法名: <!-- 属性name --> <a :[name]="url"> ... < ...