简介

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. javaweb项目中jsp的from表单提交action内容与web.xml的servlet-mapping对应

    login.jsp <%@ page contentType="text/html;charset=UTF-8" language="java" %> ...

  2. Docker学习笔记:在Windows7下安装

    下载 DockerToolbox-19.03.1.exe 进行安装: 安装比较简单,双击运行,点下一步即可,可以勾选自己需要的组件: 安装成功后,桌边会出现三个图标,如下图所示: 点击 Docker ...

  3. Spider--实战--bs静态网页爬取TOP250电影

    import requests from bs4 import BeautifulSoup def gettop250(): headers={ 'user-agent':'Mozilla/5.0 ( ...

  4. linux基本操作之linux登陆

    一 文本登陆方式: 输入用户名与密码:/etc/passwd文件对照(口令文件,保存基本的用户信息):/etc/shadow文件对照(影子文件,保存密码信息):启动相应的shell程序:用户得到 一个 ...

  5. osd磁盘空间足够无法写入数据的分析与解决

    前言 这个问题的来源是ceph社区里面一个群友的环境出现在85%左右的时候,启动osd报错,然后在本地文件系统当中进行touch文件的时候也是报错,df -i查询inode也是没用多少,使用的也是in ...

  6. JavaScrip_12.23

    笔记系列,零散的知识点,准备以后复习整理使用 JavaScrip - 事件DOM绑定[将函数添加到一个元素对象的属性中] 1.事件 鼠标.键盘.操作等:所有的GUI都有 onclick(单击事件) 例 ...

  7. "三剑客"之awk心中无剑

    一.awk介绍 awk 是一种程序语言. 它具有一般程序语言常见的功能. 因awk语言具有某些特点, 如 : 使用直译器(Interpreter)不需先行编译; 变量无类型之分(Typeless), ...

  8. 在多个浏览器中添加IDM插件

    许多朋友下载了IDM(Internet Download Manager)不知如何使用.把包含视频的链接放到软件新建任务,下载下来的的却是网页而不是视频.该软件下载视频的其中一个方法,需安装浏览器插件 ...

  9. CorelDRAW文件损坏的几种解决方法

    以前做好的CorelDRAW文件突然打不开了,或者是死机.非法操作等原因造成CorelDRAW文件损坏,有时打开源文件发现一片空白,源文件保存损坏无法打开怎么办?此时不要着急,你可以试试以下几种办法帮 ...

  10. 巧妙运用Camtasia 旅行Vlog轻松get

    旅行时,除了要欣赏当地的美丽风景.享受当地美食外,当然还要将旅行中的各种小细节记录下来.以前我们可能更多地使用相机拍照,现在呢,越来越多的人采用视频拍摄的方式制作Vlog.这种兼具影像与叙事的视频表现 ...