简介

flask-migrate是flask的一个扩展模块,主要是扩展数据库表结构的.

官方文档:http://flask-migrate.readthedocs.io/en/latest/

使用

使用一共分为三步:

创建迁移环境->生成迁移脚本->更新数据库

本地数据库连接与相关配置文件 config.py

import os


DEBUG = True
# DEBUG = False
SECRET_KEY = os.urandom(24)

# HOSTNAME = 'mysql'
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'autumnwater'
USERNAME = 'root'
PASSWORD = 'root'

SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT,
DATABASE)

SQLALCHEMY_TRACK_MODIFICATIONS = False

数据库迁移文件 manage.py

from flask_script import Manager
from flask_migrate import MigrateCommand, Migrate
from index import app
from exts import db

# 存放命令脚本

manager = Manager(app)

# 使用Migrate绑定app和db
migrate = Migrate(app, db)

# 添加迁移脚本的命令到manager中
manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
manager.run()

如果没有下载flask-migrate会报错,使用pip下载,下载后可查看已安装库文件:

执行命令

python manage.py db init
#初始化数据库,会创建一个migations文件夹,并且会在数据库中生成一个alembic_version表
python manage.py db migrate
#创建迁移历史(迁移脚本)
python manage.py db upgrade
#更新数据库

注:只有在第一次迁移的时候需要初始化数据库

具体步骤如下:

  1. 在MySQL中创建数据库,此处我们的数据库名为:autumnwater

  2. 使用命令

    python manage.py db init

    初始化数据库,会创建一个migations文件夹,该文件夹是Alembic模块自动创建的,默认名字叫migrations,可以在创建migrate=Migrate(app,db)对象时传入directory="filename"参数来自定义目录名

    migrations 里面有一个versions文件夹,这个文件夹用来存放迁移脚本,执行迁移命令后会自动生成迁移脚本保存在里面

    同时会在数据库中生成一个alembic_version表

    我这里是python3的环境,所以上述命令 python -> python3

    同时可见migations文件夹已生成:

  3. 使用命令

    python manage.py db migrate

    创建迁移历史(迁移脚本),可以通过 -m 参数添加迁移信息,类似于git提交代码时添加提交信息,例如:

    python manage.py db migrate -m "create table"

    执行该步骤时显示

    解决方案寻找:

    https://blog.csdn.net/qq_41389354/article/details/104254677

    直接使用pip install pymysql即可

    又出现新的错误

    截取部分报错为:

    sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table 'performance_schema.session_variables' doesn't exist") [SQL: SHOW VARIABLES LIKE 'sql_mode'] (Background on this error at: http://sqlalche.me/e/13/f405)

    在 stackoverflow 上找到解决方案:

    https://stackoverflow.com/questions/31967527/table-performance-schema-session-variables-doesnt-exist

    进入mysql的bin目录下,打开cmd运行:

    mysql_upgrade -u root -p --force

    出现该问题的原因应该是之前我将phpstudy里面的mysql强制升级为了5.7版本

    重启phpstudy,然后重新运行

    python manage.py db migrate

    如图:

  4. 最后更新数据库,完成迁移

    python manage.py db upgrade

    查看数据库的表

    如图,执行 upgrade 命令后,会在数据库中创建一张 alembic_version 表,这张表不是代码中定义的,是 Alembic 自动创建的(看名字就知道了),里面保存的是当前数据库的版本 id

    alembic_version 表不能删除,删除后就不能继续执行数据库迁移操作了,除非重新初始化。

    同时,执行 upgrade 命令后,会根据代码中定义的模型类创建对应的表,表的字段与模型类中定义的一致。

    如上面的数据库中创建了user表,因为在我的models里面定义了该表:

    from exts import db
    from datetime import datetime
    from werkzeug.security import generate_password_hash, check_password_hash


    class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(20), nullable=False)
    username = db.Column(db.String(50), nullable=False)
    pw_hash = db.Column(db.String(128), nullable=False)

    def __init__(self, email, username, password):
    self.email = email
    self.username = username
    self.set_password(password)

    def set_password(self, password):
    self.pw_hash = generate_password_hash(password)

    def check_password(self, password):
    return check_password_hash(self.pw_hash, password)

    而如果数据库中有其他表(没有对应模型类的表),会被删除。这点需要特别注意,数据库迁移时最好使用一个新的数据库(不要与其他项目用同一个数据库),避免造成数据丢失。

优势

个人直观感受使用数据库迁移的优势有:

  • 使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表。就是将关系型数据库的一张张表转化成了Python的一个个类。

    这里即我们之前在 models.py 文件中创建的类,可以通过数据库迁移直接生成表

  • 在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库,最简单粗暴的方式就是删除旧表,然后在增加新表,这样做的缺点是会造成数据丢失。在 Flask 中,可以使用数据库迁移来解决这个问题,数据库迁移可以追踪数据模型类的变化,然后把变动应用到数据库中,不会删表造成数据丢失。

大部分参考COPY

https://www.cnblogs.com/jiangchunsheng/p/9218338.html

https://blog.csdn.net/weixin_43790276/article/details/103554632

https://www.jianshu.com/p/70cc32d9d2ff

Flask flask-migrate 数据库迁移的更多相关文章

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

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

  2. Flask之flask-migrate 数据库迁移

    简介 flask-migrate是flask的一个扩展模块,主要是扩展数据库表结构的. 官方文档:http://flask-migrate.readthedocs.io/en/latest/ 使用fl ...

  3. migrate数据库迁移

    可先参看博友的博文:https://segmentfault.com/a/1190000005599416 由于Yii migrate 生成的迁移文件默认是存放在 console/migrations ...

  4. Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]解决

    Laravel5.x运行迁移命令创建数据表:php artisan migrate报错. Illuminate\Database\QueryException  : SQLSTATE[42000]: ...

  5. yii2 migrate 数据库迁移的简单分享

    开发中经常会用到的方法小结: 1../yii migrate xxx_xx 在表中插入某字段 : public function up() {$this->addColumn('{{applic ...

  6. Flask_Migrate数据库迁移

    migrate数据库迁移 有models,没有迁移仓库.本地新建数据库:首次创建迁移仓库.迁移脚本:执行迁移脚本生成数据库表: python manage.py db init python mana ...

  7. 细说flask数据库迁移

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

  8. flask数据库迁移理解及命令

    前言: 使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表.就是将关系型数据库的一张张表转化成了Python的一个个类. 在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库, ...

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

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

  10. Flask 数据库迁移

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

随机推荐

  1. Spring源码之Bean生命周期

    https://www.jianshu.com/p/1dec08d290c1 https://www.cnblogs.com/zrtqsk/p/3735273.html 总结 将class文件加载成B ...

  2. 《HarmonyOS设备开发入门手册》

    HarmonyOS设备开发入门手册-更新 [欢迎大家点击下载] 作者:连志安 想了解更多内容,请访问: 51CTO和华为官方战略合作共建的鸿蒙技术社区 https://harmonyos.51cto. ...

  3. 支持jewel版本的calamari

    之前测试了下,发现calamari不支持jewel版本的,是因为接口了有了一些变化,在提出这个问题后,作者给出了回答,说肯定会支持的,并且做了一点小的改动,就可以支持了,这个作者merge了到了git ...

  4. Java从后端下载文件到浏览器

    // 注: // 获取项目下文件或者文件流 // File file = new File(this.getClass().getResource("/xls/adminImportUser ...

  5. SQL SERVER数据库内 FOR XML PATH 函数用法

    把自己点点滴滴的学习记录下来!!!! 一.FOR XML PATH 简单介绍 那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(TBJTXXCE)用来存放就诊患者信息,表结构 ...

  6. beef抓包简析

    搭建完了beef就想简答的抓下包分析下 这是第一个包,追踪它 返回demo页面,并发现其中的脚本 window.location.protocol表示协议http, window.location.h ...

  7. 新鲜出炉!2020年最新java面试题大全,面试突击必备!

    前言 发现网上很多Java面试题都没有答案,所以花了很长时间搜集整理出来了一套Java面试题,希望对大家有帮助哈~ 打算这几天每天更新15~20题.(这样有助于你们阅读和理解!)我们先从简单的开始 1 ...

  8. 深度分析:面试90%被问到的 Session、Cookie、Token,看完这篇你就掌握了!

    Cookie 和 Session HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录:Session 和 Cookie 的主要目的 ...

  9. How to realize one's ambition

    Work Overtime Can it work? To some extent, it parhaps works very well. What if you do little job and ...

  10. 教你用Camtasia制作精美片头

    大家都知道在视频播放中,如果有一个令人印象深刻的精彩开头,整个视频的内容都能因此得到不少升华.所以有一个好的片头对于视频的制作来说十分重要.今天我们就来讲一下用Camtasia制作片头的方法. 首先, ...