Fork me on GitHub

Flask学习笔记(十二)-Flask-Migrate实现数据库迁移详解

一、定义

  • flask-migrate是基于Alembic的一个封装,并集成到Flask
  • 所有的迁移操作其实都是Alembic做的,能跟踪模型的变化,并将变化映射到数据库中。

二、Flask-Migrate安装

pip install flask-migrate

三、使用Flask-Migrate步骤 

实例展示:

目录结构: 

flask_SQLalchemy:.
  │ config.py
  │ app.py
  │ manager.py
  │ models.py
  │ __init__.py

config.py文件(数据库配置文件):

class Configs:
    ENV='development'
    DEBUG=True
    # 设置连接数据库路径
    SQLALCHEMY_DATABASE_URI='mysql+pymysql://root:root@xxx.116.152.57:3308/flask_test'
    # 每次请求结束后自动提交数据库中的改动
    SQLALCHEMY_COMMIT_ON_TEARDOWN=True
    # 禁用SQLAlchemy对追踪对象的修改并且发送信号
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    # 操作数据库时显示原始SQL语句
    SQLALCHEMY_ECHO=True

app.py文件(连接数据库):  

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import Configs
db = SQLAlchemy()
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = Configs.SQLALCHEMY_DATABASE_URI

@app.route('/')
def index():
    return "Hello!"

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

  model.py文件(作用是存储一个User类),内容如下:

from app import db

class User(db.Model):
	__tablename__ = 'user'
	user_id = db.Column(db.Integer, primary_key=True)
	username = db.Column(db.String(60), nullable=False)
	password = db.Column(db.String(30), nullable=False)

	def __repr__(self):
		return '<User %s>' % self.username

manager.py文件(数据迁移管理,运行后将生成一个文件夹),内容如下:

from app import db,app
from flask_migrate import Migrate, MigrateCommand
from flask_script import Manager
from models import User

# !!!绑定app和数据库
migrate = Migrate(app,db)
manager = Manager(app)
db.init_app(app)
manager.add_command('db', MigrateCommand)

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

迁移步骤:

1、进入项目目录通过命令行执行:

   初始化一个环境:python manager.py db init

   自动检测模型,生成迁移脚本:python manager.py db migrate

   将迁移脚本映射到数据库中:python manager.py db upgrade

执行命令:

 

 数据库表展示:

 2、修改model.py内容更新user表结构

from exts import db

class User(db.Model):
	id = db.Column(db.Integer,primary_key=True)
	username = db.Column(db.String(80),unique=True)
	password = db.Column(db.String(30), nullable=False)
	test = db.Column(db.String(50), nullable=False)       #新添加的一列 

	def __repr__(self):
		return '<User %s>' % self.username

修改后执行:

python manager.py db init:这个命令不需要执行,因为已经初始化了迁移脚本的环境,这个命令只执行一次。

python manager.py db migrate:这个命令需要执行,因为模型改变了。

python manager.py db upgrade这个命令也需要执行,每次运行了migrate命令后,就记得要运行这个命令。

查看对应表结构变化:

 可以看到test字段已经更新到数据表中

备注:

报错cannot import name 'soft_unicode' from 'markupsafe' 的解决方法

pip install --user --upgrade aws-sam-cli 

  

 

 

 

  

  

posted @ 2022-10-12 22:28  橘子偏爱橙子  阅读(335)  评论(0编辑  收藏  举报