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()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...
随机推荐
- zeromq学习记录(九)练习代码学习ZMQ_ROUTER ZMQ_READLER
/************************************************************** 技术博客 http://www.cnblogs.com/itdef/ ...
- win10自带输入法的标点符号切换
快捷键是ctrl+句号 然后开启设置,把中文也用英文标点也选上.
- mac开发常用工具和插件记录
1.alfred 是 Mac 系统上一款专注于效率提升的著名应用,它能帮你快速打开网页.快速进行自定义搜索.查看剪贴板历史.快速查询单词等等.Alfred 提供的功能虽然很多,但目的只有一个 —— 那 ...
- python闭包的详细解析
一.什么是闭包? 如果一个内嵌函数访问外部嵌套函数作用域的变量,并返回这个函数,则这个函数就是闭包 闭包必须满足三个条件: 1. 必须有一个内嵌函数 2. 内嵌函数必须引用外部嵌套函数中的变量 ...
- JavaWeb环境搭建(作业八)
1.JDK下载配置: (1)在官网下载jdk. (2)安装jdk.双击下载好的jdk,中间会选两次安装路径,一次是装jdk,一次是装jre.记住安装的路径. (3)配置环境变量. 1.在我的电脑右键属 ...
- Paper | 块分割信息 + 压缩视频质量增强
目录 1. 亮点 2. 网络 3. Mask 及其融合 4. 结论 论文:Enhancing HEVC Compressed Videos with a Partition-Masked Convol ...
- salt 配置管理
索引 saltstack入门 salt state sls 描述文件 saltstack配置管理高级功能 saltstack入门 192.168.86.3 salt 修改 [root@Zabbix-s ...
- bash编程-Shell变量
bash中,所有变量的值默认均为字符串. 1. 变量操作 调用变量 $变量 查看变量(所有类型) set 删除变量 unset 变量 2. 变量分类 2.1 自定义变量 自定义变量仅对当前Shell有 ...
- 【BZOJ】 Hash Killer I II III
前言 这里只是一个整理... Solution Hash Killer I Hash Killer II
- Android 使用View绘制文字(DrawText)技术总结
转载请注明出处: http://www.cnblogs.com/renhui/p/7453534.html 这里的绘制文字不是直接调用TextView.setText(String content)去 ...