Flask学习笔记(十二)-Flask-Migrate实现数据库迁移详解
一、定义
flask-migrate
是基于Alembic
的一个封装,并集成到Flask
中- 所有的迁移操作其实都是
Alembic
做的,能跟踪模型的变化,并将变化映射到数据库中。
二、Flask-Migrate安装
1 | pip install flask-migrate |
三、使用Flask-Migrate步骤
实例展示:
目录结构:
flask_SQLalchemy:.
│ config.py
│ app.py
│ manager.py
│ models.py
│ __init__.py
config.py文件(数据库配置文件):
1 2 3 4 5 6 7 8 9 10 11 | 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文件(连接数据库):
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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类),内容如下:
1 2 3 4 5 6 7 8 9 10 | 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文件(数据迁移管理,运行后将生成一个文件夹),内容如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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表结构
1 2 3 4 5 6 7 8 9 10 | 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
本文来自博客园,作者:橘子偏爱橙子,转载请注明原文链接:https://www.cnblogs.com/xfbk/p/16785583.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· winform 绘制太阳,地球,月球 运作规律
· 上周热点回顾(3.3-3.9)