Flask-migrate

这篇博客介绍了如何使用Flask-Migrate进行数据库操作,避免因模型修改而需要删除原有表的问题。主要包括Flask-Migrate的安装和使用,如初始化环境、执行迁移和升级命令。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

  1. 通过命令行执行数据库操作
  2. 因为使用db.create_all()进行ORM映射时模型修改后需要删除原来的表才能重新映射新模型,所以使用flas-migrate来进行数据库迁移,通过命令行对被修改的模型进行新的映射

安装Flask-Migrate

  1. 进入虚拟环境并执行activate
  2. 执行pip install flask-migrate
(flask-env) C:\pyenv\flask-env\Scripts>pip install flask-migrate
Collecting flask-migrate
  Downloading Flask-Migrate-2.1.1.tar.gz
Requirement already satisfied: Flask>=0.9 in c:\pyenv\flask-env\lib\site-packages (from flask-migrate)
Requirement already satisfied: Flask-SQLAlchemy>=1.0 in c:\pyenv\flask-env\lib\site-packages (from flask-migrate)
Collecting alembic>=0.6 (from flask-migrate)
  Downloading alembic-0.9.5.tar.gz (990kB)
    100% |████████████████████████████████| 993kB 287kB/s
Requirement already satisfied: itsdangerous>=0.21 in c:\pyenv\flask-env\lib\site-packages (from Flask>=0.9->flask-migrate)
Requirement already satisfied: click>=2.0 in c:\pyenv\flask-env\lib\site-packages (from Flask>=0.9->flask-migrate)
Requirement already satisfied: Jinja2>=2.4 in c:\pyenv\flask-env\lib\site-packages (from Flask>=0.9->flask-migrate)
Requirement already satisfied: Werkzeug>=0.7 in c:\pyenv\flask-env\lib\site-packages (from Flask>=0.9->flask-migrate)
Requirement already satisfied: SQLAlchemy>=0.8.0 in c:\pyenv\flask-env\lib\site-packages (from Flask-SQLAlchemy>=1.0->flask-migrate)
Collecting Mako (from alembic>=0.6->flask-migrate)
  Downloading Mako-1.0.7.tar.gz (564kB)
    100% |████████████████████████████████| 573kB 187kB/s
Collecting python-editor>=0.3 (from alembic>=0.6->flask-migrate)
  Downloading python-editor-1.0.3.tar.gz
Collecting python-dateutil (from alembic>=0.6->flask-migrate)
  Downloading python_dateutil-2.6.1-py2.py3-none-any.whl (194kB)
    100% |████████████████████████████████| 194kB 172kB/s
Requirement already satisfied: MarkupSafe>=0.23 in c:\pyenv\flask-env\lib\site-packages (from Jinja2>=2.4->Flask>=0.9->flask-migrate)
Collecting six>=1.5 (from python-dateutil->alembic>=0.6->flask-migrate)
  Downloading six-1.11.0-py2.py3-none-any.whl
Building wheels for collected packages: flask-migrate, alembic, Mako, python-editor
  Running setup.py bdist_wheel for flask-migrate ... done
  Stored in directory: C:\Users\Mark\AppData\Local\pip\Cache\wheels\c7\8d\a3\2a49034f68812a647c04bc467aa4a66af861126e99567a16bf
  Running setup.py bdist_wheel for alembic ... done
  Stored in directory: C:\Users\Mark\AppData\Local\pip\Cache\wheels\d1\0e\b9\fb570150b350298e1d8f1ff38a400ae709580b36e43bc3ac91
  Running setup.py bdist_wheel for Mako ... done
  Stored in directory: C:\Users\Mark\AppData\Local\pip\Cache\wheels\33\bf\8f\036f36c35e0e3c63a4685e306bce6b00b6349fec5b0947586e
  Running setup.py bdist_wheel for python-editor ... done
  Stored in directory: C:\Users\Mark\AppData\Local\pip\Cache\wheels\84\d6\b8\082dc3b5cd7763f17f5500a193b6b248102217cbaa3f0a24ca
Successfully built flask-migrate alembic Mako python-editor
Installing collected packages: Mako, python-editor, six, python-dateutil, alembic, flask-migrate
Successfully installed Mako-1.0.7 alembic-0.9.5 flask-migrate-2.1.1 python-dateutil-2.6.1 python-editor-1.0.3 six-1.11.0

(flask-env) C:\pyenv\flask-env\Scripts>

使用

  1. 使用flask-migrate必须使用flask-scripts这个模块中MigrateCommand包中包含了所有和数据库相关的命令
  2. flask-migrate的命令有三个:
    • python manager.py db init 准备迁移环境
    • python manager.py db migrate 迁移
    • python manager.py db upgrade 提交
  3. 模型有变动时需要在命令行执行 migrare upgrade重新映射到数据库
#---------manager.py----------
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand
from exts import db
from models import Phone
from mark_app import app


manager = Manager(app)
migrate = Migrate(app, db)
manager.add_command('db', MigrateCommand)


@manager.command
def runserver():
    print("服务器跑起来了...")


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

"""
数据库相关操作都通过flask-migrate在manager.py中执行
主app文件中不需要再导入models,也不需要再使用db.crate_all()了
"""

-----------终端执行命令--------------
(flask-env) d:\git_project\flask_app>python manager.py db init
Creating directory d:\git_project\flask_app\migrations ... done
Creating directory d:\git_project\flask_app\migrations\versions ... done
Generating d:\git_project\flask_app\migrations\alembic.ini ... done
Generating d:\git_project\flask_app\migrations\env.py ... done
Generating d:\git_project\flask_app\migrations\README ... done
Generating d:\git_project\flask_app\migrations\script.py.mako ... done
Please edit configuration/connection/logging settings in 'd:\\git_project\\flask_app\\migrations\\alembic.ini' before proceeding.

(flask-env) d:\git_project\flask_app>python manager.py db migrate
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added table 'phone'
INFO  [alembic.autogenerate.compare] Detected removed table 'article_tag'
INFO  [alembic.autogenerate.compare] Detected removed table 'user'
INFO  [alembic.autogenerate.compare] Detected removed table 'dept'
INFO  [alembic.autogenerate.compare] Detected removed table 'userinfo'
INFO  [alembic.autogenerate.compare] Detected removed table 'tbl_test'
INFO  [alembic.autogenerate.compare] Detected removed table 'article'
INFO  [alembic.autogenerate.compare] Detected removed table 'girl'
INFO  [alembic.autogenerate.compare] Detected removed table 'products'
INFO  [alembic.autogenerate.compare] Detected removed table 'tag'
Generating d:\git_project\flask_app\migrations\versions\5f8edfb0ef2a_.py ... done

(flask-env) d:\git_project\flask_app>python manager.py db upgrade
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> 5f8edfb0ef2a, empty message

(flask-env) d:\git_project\flask_app>python manager.py db migrate
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added column 'phone.price'
Generating d:\git_project\flask_app\migrations\versions\7cbcd5cc0bdd_.py ... done

(flask-env) d:\git_project\flask_app>python manager.py db upgrade
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade 5f8edfb0ef2a -> 7cbcd5cc0bdd, empty message

(flask-env) d:\git_project\flask_app>
### 使用 Flask-Migrate 进行数据库迁移 #### 安装依赖库 为了能够使用 Flask-Migrate 扩展,需要先通过 pip 工具安装必要的 Python 库。通常情况下会涉及到 `Flask`、`Flask-SQLAlchemy` 和 `Flask-Migrate` 的安装。 ```bash pip install flask flask-sqlalchemy flask-migrate ``` #### 初始化项目结构 一个典型的基于 Flask 构建的应用程序目录可能如下所示: - **app/** 存放应用程序逻辑代码。 - **migrations/** 数据库版本控制脚本存放位置。 - **config.py** 配置文件用于设定连接字符串和其他参数。 - **run.py** 启动服务器入口文件。 - **manage.py** 命令行工具用来管理任务如运行迁移操作[^1]。 #### 创建并配置 Flask 应用实例 在 `__init__.py` 文件内初始化 Flask 实例,并关联 SQLAlchemy 及 Migrate 对象到该应用上。 ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate app = Flask(__name__) app.config[&#39;SQLALCHEMY_DATABASE_URI&#39;] = &#39;sqlite:///site.db&#39; # 设置数据库URI db = SQLAlchemy(app) migrate = Migrate(app, db) # 导入路由模块... ``` #### 定义模型类 接下来,在 models.py 中定义 ORM 映射关系的数据表模型。 ```python class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) def __repr__(self): return f&#39;<User {self.username}>&#39; ``` #### 初次迁移前准备 首次启动新项目时需调用命令生成初始状态下的 migration 脚本。 ```bash flask db init flask db migrate -m "Initial commit" ``` 第一条指令会在当前工作区下建立名为 migrations 的文件夹;第二条则依据现有数据表结构自动生成差异 SQL 并保存至上述路径中去[^3]。 #### 提交更改到数据库 一旦确认无误之后就可以正式施行这些变更了。 ```bash flask db upgrade ``` 此过程会按照既定顺序依次执行所有待处理的操作直至最新版为止。如果想要回滚某一步骤,则可以借助 downgrade 方法撤销最近一次更新。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值