06flask_migrate
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的更多相关文章
随机推荐
- Linux动态链接库的生成和使用
目录 1. 编写C程序 2. 编译动态链接库 3. 使用共享库 4. 执行程序 5. 参考资料 1. 编写C程序 比如编写myfunc.c文件,里面包含两个函数,一个是say_hello,另一个是ca ...
- VS2017添加引用报错
未能正确加载“ReferenceManagerPackage”包. 此问题可能是因配置更改或安装另一个扩展导致的.可通过查看文件“C:\Users\Administrator\AppData\Roam ...
- JAVA开发环境搭建(Mac)
1. 打开Terminal, 执行命令: java -version 即可查看到我们所安装的jdk版本. 2.安装jdk成功之后,我们还需要配置jdk环境变量. 使用命令: /usr/libexec/ ...
- vue.js学习系列-第一篇
VUE系列一 简介 vue是一个兴起的前端js库,是一个精简的MVVM.从技术角度讲,Vue.js专注于 MVVM 模型的 ViewModel 层.它通过双向数据绑定把 View 层和 Mode ...
- 小E浅谈丨区块链治理真的是一个设计问题吗?
在2018年6月28日Zcon0论坛上,“区块链治理”这个话题掀起了大神们对未来区块链治理和区块链发展的一系列的畅想. (从左至右,分别为:Valkenburgh,Zooko,Jill, Vitali ...
- Debian 命令行方式配置网络
一.对于有线网络,如果默认没有安装图形界面,进入了 multi-user.target中时,是没有使用NetworkManager管理网络的,此时需要手动配置才能上网 首先得到网卡名称:ip addr ...
- python(random模块)取10以内的随机数
上面有个selenium-webdriver循环点击百度搜索结果以及获取新页面的handler文章,随机获取百度搜索结果中不同id的结果,实现代码如下: #coding:utf- import ran ...
- 题解 P4705 【玩游戏】
这题是真的神仙啊...居然用的 stl 来卡常? 话说 998244353 真的可以一眼 NTT ? noteskey 所以说只要推柿子就好了但是有的地方的推导根本就想不到... 我们令第 t 个答案 ...
- 【medium】4. Median of Two Sorted Arrays 两个有序数组中第k小的数
There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two ...
- Python爬虫基础之UrlError
一.urllib.error python的urllib.error模块主要是应对urllib.request在网络请求过程中出现的异常而定义的异常处理类.主要有URLError和HTTPError两 ...