前言:

  • 使用数据库迁移,可以直接建表,而不用我们自己写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数据库迁移理解及命令的更多相关文章

  1. 细说flask数据库迁移

    什么情况下要用数据库迁移? 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化 ...

  2. Flask 数据库迁移

    在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中. ...

  3. flask 数据库迁移的简单操作

    1.目的:修改现有数据库的表结构,不改变数据库中现有的数据. 2.导包:from flask_migrate import Migrate, MigrateCommandfrom flask_scri ...

  4. flask数据库迁移

    实际操作顺序:1.python 文件 db init2.python 文件 db migrate -m"版本名(注释)"3.python 文件 db upgrade 然后观察表结构 ...

  5. ASP.NET MVC 4下 Code First 数据库迁移

     一.命令开启 1.打开控制台:视图->其他窗口->程序包管理器控制台: 2.启动数据库迁移,执行命令:enable-migrations 创建成功后会新增migrations目录等. 若 ...

  6. asp.net mvc CodeFirst模式数据库迁移步骤

    利用Code First模式构建好基本的类后,项目也开始搭建完毕并成功运行,而且已经将数据库表结构自动生成了. 但是,我有新的类要加入,有字段需要修改,那怎么办呢,删库,跑路 ?  哈哈 利用数据库迁 ...

  7. Flask从入门到精通之使用Flask-Migrate实现数据库迁移

    在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库.仅当数据库表不存在时,Flask-SQLAlchemy 才会根据模型进行创建.因此,更新表的唯一方式就是先删除旧表,不 ...

  8. Flask项目中数据库迁移的使用

    数据库迁移 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用 ...

  9. Flask学习笔记:数据库迁移操作flask-script+alembic/flask-migrate

    数据库迁移是将代码中模型类(即表)的修改同步到数据库中, flask-sqlalchemy的模型类一旦使用create_all()映射到数据库中后,对这个模型类的修改(例如添加了一个新的字段)就不会再 ...

随机推荐

  1. 深入理解JVM(一)编译openJDK

    此文总结的很不错:https://www.cnblogs.com/ACFLOOD/p/5528035.html 准备openJDK源码和环境 1.在linux和macOS上编译openJDK更加友好, ...

  2. mysql 在update中实现子查询的方式

    当使用mysql条件更新时--最先让人想到的写法 UPDATE buyer SET is_seller=1 WHERE uid IN (SELECT uid FROM seller) 此语句是错误的, ...

  3. HQL数据查询基础

    HQL定义 1.Hibernate Query Language, Hibernate查询语言 2.HQL是面向对象的查询语言(HQL查询的主体是映射配置的持久化类及其属性而SQL查询主体是数据库表) ...

  4. Javascript上传超大文件实例

    因业务需求需要向伺服器上传大于1GB以上的视频文件,其实网上也能找到很多大文件上传的第三方组件,问题是要么用起来相当不方便,总出现一些bug,要么收费太贵(费用几千,甚至还限定使用数量),最终自己开发 ...

  5. python之os库

    python之os库 os.name 判断现在正在实用的平台,Windows 返回 'nt'; Linux 返回'posix' >>> os.name 'nt' os.getcwd( ...

  6. 函数round和trunc

    1.round函数. round函数能够按照数学规则进行四舍五入的进位,以保留小数点后要求的位数. 使用方法为 round(<小数>,<保留的位数>) 下面是两个例子: ) f ...

  7. iOS 10 应用内跳转到系统设置

    在iOS开发中,有时会有跳转系统设置界面的需求,例如提示用户打开蓝牙或者WIFI,提醒用户打开推送或者位置权限等.在iOS6之后,第三方应用需要跳转系统设置界面,需要在URL type中添加一个pre ...

  8. 给JavaScript24条最佳实践

    作为“30 HTML和CSS最佳实践”的后续,这篇文章将回顾JavaScript的知识 !如果你看完了下面的内容,请务必让我们知道你掌握的小技巧! 1.使用 === 代替 == JavaScript ...

  9. 【接口时序】1、软件与Verilog基本格式规范说明

    一. 说明 以前总是没有记录的习惯,导致遇到问题时总得重新回忆与摸索,大大降低了学习效率,从今天开始决定改掉这个坏毛病,认真记录自己的Verilog学习之路,希望自己能一直坚持下去. 二. 软件资源与 ...

  10. 突然 不能f**q

    ss 突然访问不了,于是去查看ip是否被f,发现国outer 国inner 都通,不知道什么情况,后来把 系统代理模式 改为全局,发觉可以,又把他改为 pac模式,正常了.           记录一 ...