flask数据库迁移理解及命令
前言:
- 使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表。就是将关系型数据库的一张张表转化成了Python的一个个类。
- 在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库,最简单粗暴的方式就是删除旧表,然后在增加新表,这样做的缺点是会造成数据丢失。
- 使用数据库迁移,可以追踪数据库模式的变化,然后把变动应用到数据库中。
- 在flask中使用Flask-Migrate来实现数据库迁移,并且集成到Flask-Script中,所有的操作通过命令来完成。
- 为了导出数据库迁移命令,Flask-Migrate使用了一个MigrateCommand类,可以附加到Flask-Script的manager对象上。
安装Flask-Migrate
pip install flask-migrate
Python代码,用户类和角色类。
#!/usr/bin/python
#coding:utf- from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand """
flask_migrate作用:
、通过命令的方式创建表
、修改表的结构
""" class Config(object):
SQLALCHEMY_DATABASE_URI = "mysql://root:@127.0.0.1:3306/book"
# 这个值可以设置,也可以不设置,如果不设置,那么会一直报警告
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 这里有个坑,下次再讲。在lask-sqlalchemy 2.0之后就不在需要设置这一项了。
SQLALCHEMY_COMMIT_ON_TEARDOWN = True app = Flask(__name__)
app.config.from_object(Config) db = SQLAlchemy(app)
manager = Manager(app) # 第一个参数是flask实例,第二个参数SQLAlchemy实例
Migrate(app, db) #manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command("db", MigrateCommand) class Role(db.Model):
__tablename__ = "roles"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String())
title = db.Column(db.String())
us = db.relationship("User",backref="role") class User(db.Model):
__tablename__="users"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String())
email = db.Column(db.String())
password = db.Column(db.String())
role_id = db.Column(db.Integer,db.ForeignKey("roles.id")) @app.route("/")
def index():
return "index" if __name__ == '__main__':
manager.run()
关于config的配置,可以参考flask-Script中文文档
迁移数据库三步走:
第一步:创建迁移仓库
python database.py db init
这里的db是迁移命令的对象,名字可以随便取,但是需要保持一致。
这个命令会创建migrations文件夹,所有迁移文件都放在里面。
这里只是创建了迁移仓库,表还没创建。
可以看到表还没有创建。
第二步:创建迁移脚本
- 自动创建迁移脚本有两个函数
- upgrade():函数把迁移中的改动应用到数据库中。
- downgrade():函数则将改动删除。
- 自动创建的迁移脚本会根据模型定义和数据库当前状态的差异,生成upgrade()和downgrade()函数的内容。
- 对比不一定完全正确,有可能会遗漏一些细节,需要进行检查
python database.py db migrate -m 'initial migration'
"initial migration"是注释
在windows下这里也存在一个坑。
这个坑在这里解释下:
windows系统不支持cmd接收的参数中含有空格,例如我们上面'initial migration',系统收到的是两个参数,所以报错会显示参数过多。
我的解决办法是在两个单词之间加上“_”连接当然方法很多,我这里就使用这种简单粗暴的。
这种情况下,注释会报错。
这样则不会。
运行命令之后,只是在migrations文件夹中新增了数据库迁移的版本文件并没有在数据库也只是创建了版本号,并没有生成对应的表。
第三步:更新数据库
更新数据库命令:
python migrate.py db upgrade
可以看到已经创建表成功了。
如果我们需要讲roles表中的title字段删除,我们再看下版本文件的变化。
删除前:
删除后:
将代码中的title删除,然后再次执行迁移脚本命令
python migrate.py db migrate -m 'del_title'
这个时候数据库中title字段还没有被删除
执行更新数据库操作:
可以看到数据库中,数据被删除。
python migrate.py db upgrade
实际操作顺序:
1.python 文件 db init
2.python 文件 db migrate -m"版本名(注释)"
3.python 文件 db upgrade 然后观察表结构
4.根据需求修改模型
5.python 文件 db migrate -m"新版本名(注释)"
6.python 文件 db upgrade 然后观察表结构
7.若返回版本,则利用 python 文件 db history查看版本号
8.python 文件 db downgrade(upgrade) 版本号
先写这么多,发现写起来,真的有很多内容可以写。待续。。。
flask数据库迁移理解及命令的更多相关文章
- 细说flask数据库迁移
什么情况下要用数据库迁移? 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化 ...
- Flask 数据库迁移
在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中. ...
- flask 数据库迁移的简单操作
1.目的:修改现有数据库的表结构,不改变数据库中现有的数据. 2.导包:from flask_migrate import Migrate, MigrateCommandfrom flask_scri ...
- flask数据库迁移
实际操作顺序:1.python 文件 db init2.python 文件 db migrate -m"版本名(注释)"3.python 文件 db upgrade 然后观察表结构 ...
- ASP.NET MVC 4下 Code First 数据库迁移
一.命令开启 1.打开控制台:视图->其他窗口->程序包管理器控制台: 2.启动数据库迁移,执行命令:enable-migrations 创建成功后会新增migrations目录等. 若 ...
- asp.net mvc CodeFirst模式数据库迁移步骤
利用Code First模式构建好基本的类后,项目也开始搭建完毕并成功运行,而且已经将数据库表结构自动生成了. 但是,我有新的类要加入,有字段需要修改,那怎么办呢,删库,跑路 ? 哈哈 利用数据库迁 ...
- Flask从入门到精通之使用Flask-Migrate实现数据库迁移
在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库.仅当数据库表不存在时,Flask-SQLAlchemy 才会根据模型进行创建.因此,更新表的唯一方式就是先删除旧表,不 ...
- Flask项目中数据库迁移的使用
数据库迁移 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用 ...
- Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate
数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...
随机推荐
- c++ stl源码剖析学习笔记(三)容器 vector
stl中容器有很多种 最简单的应该算是vector 一个空间连续的数组 他的构造函数有多个 以其中 template<typename T> vector(size_type n,cons ...
- ABP .NET corej 版本 第一篇
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ABP使用以下技术: 服务器端: l ASP.NET MVC 5.Web API 2.C# 5. ...
- js 定时更改div背景图片
今天遇到一个业务场景,使用js将一个div标签的背景图片定时更换一下. 之前百度了几个,有css+js,也有css3的,不过css3的兼容有问题,之后同事提示,可以使用js直接来更换div的北京图片, ...
- 20175316盛茂淞 2018-2019-2 《Java程序设计》第5周学习总结
20175316盛茂淞 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 第六章 接口与实现. 何谓接口 接口:书上没有明确地给出接口的定义,我理解的接口就是一 ...
- Webview窗口设置遮罩层
在Webview窗口中如果存在子Webview的情况下,使用html中的css来做页面遮罩无法覆盖子Webview,为了解决此问题,WebviewStyle对象添加mask属性,用于设置Webview ...
- JSON笔记整理
JSON简介: JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法.类似 XML. JSON 比 XML ...
- jvm虚拟机--垃圾回收子系统
转载自cyc2018的github:https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Java%20%E8%99%9A%E ...
- ArcEngine不同种类的工作空间建立查询ICursor时“超出系统资源”
环境 这里我的工作空间有两种:mdb库和SDE库分别打开的工作空间. 查询语句:使用Field in ('1','2')查询方式来得到游标对象. 错误 当查询语句中in后面的条件值大于1500时,在I ...
- 47_并发编程-线程python实现
一.Threading模块 1.线程的创建 - 方式一 from threading import Thread import time def sayhi(name): time.sleep(2 ...
- linux下报错bash: service: command not found
在linux下操作的时候经常会遇到,bash: service: command not found这个错误,以前在网上找了,照着弄了,也没细看原因,今天又碰到这个问题,就顺便研究一下. 1.通常这种 ...