Flask 数据库迁移工具 flask-migrate
Flask 数据库迁移工具 flask-migrate
新数据库迁移 flask-migrate
由于模型中经常会新加一行或几行column (比如用来保存账户的确认状态),此时要修改 models.py,并执行一次新数据库迁移
具体步骤:
app\models.py、app\__init.py、manage.py里面,设置好 db的引用关系
__init__.py:初始化db
-
from flask_sqlalchemy import SQLAlchemy
-
db = SQLAlchemy()
-
db.init_app(app)
-
config[config_name] .init_app(app)# config.py里,指定了数据库文件,比如 mysql:///, sqlite:///
models.py: 设置好表格、字段属性
-
from . import db, login_manager
-
classOrder(db.Model):
-
__tablename__ = 'orders'# 订单表格
-
id = db.Column(db.Integer, primary_key=True)
-
body = db.Column(db.Text)
-
# 其它表格。。。
-
from app import create_app, db
-
from flask_script import Manager, Shell
-
from flask_migrate import Migrate, MigrateCommand
-
app = create_app(os.getenv('FLASK_CONFIG') or'default')
-
migrate = Migrate(app, db)
-
manager.add_command('db', MigrateCommand)
第一次使用:
- 初始化:(venv) python manage.py db init 这个命令会在项目下创建 migrations 文件夹,所有迁移脚本都存放其中。
- 创建第一个版本:(venv) $ python manage.py db migrate -m "initial migration" 检查migrations\versions,会新建一个版本.py,检查里面表格及字段
- 运行升级 (venv) $ python manage.py db upgrade,会把项目使用的数据库文件,更新为新的表格、字段,同时保留数据
后缀更新:
- 更新表格的字段 (models.py)
- 再次运行一下 db migrate -m -> 相当于commit 更新到/migrate目录
- db upgrade -> 数据库会更新
Flask 数据库迁移方法
使用Flsak-Migrate数据库迁移框架,可以保证数据库结构在发生变化时,改变数据库结构不至于丢失数据库的数据。使用其进行数据库进行数据库的迁移,主要分为三个步骤:
1 创建数据仓库
import os,json from flask import Flask, render_template, session, redirect, url_for from flask_script import Manager,Shell from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate,MigrateCommand app = Flask(__name__) app.config['SECRET_KEY'] = 'hard to guess string' app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:root@127.0.0.1/test?charset=utf8' #app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///app.db' app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True manager = Manager(app) db = SQLAlchemy(app) migrate = Migrate(app,db) class User(db.Model) : __tablename__ = 'users' id = db.Column(db.Integer, primary_key= True) username = db.Column(db.String(64), unique=True, index= True) age = db.Column(db.String(64)) .... def __repr__(self) : return '<User %r>' % self.username def make_shell_context() : return dict(app=app, db=db, User= User) # manager.add_command("shell", Shell(make_context=make_shell_context)) manager.add_command('db' , MigrateCommand) if __name__ == '__main__' : manager.run()
这里我们引入了Manager模块用来使启动flask时支持命令行。首先,分别引入了migrate模块和Manager相关模块;创建了一个manager对象,以支持自定义命令的配置;创建一个Migrate对象并关联对应的应用程序类对象app和数据库管理类对象db;最后一行将MigrateCommand命令加入到manager对象中,这样就可以在命令行中进行数据库迁移的相关命令. 需要注意的是,引入Manager支持启动应用程序的命令行时,我们还需要修改app的run语句,改为:
- manager.run()
接下来我们使用命令行模式创建一个迁移的仓库:
'db'是在manager.add_command('db',MigrateComand)这句中我们声明的命令行对象名称,init是Migrate命令,表示初始化迁移仓库,运行完成之后,会在当前目录下创建一个migrations的文件夹,用于进行迁移的数据库脚本都放在这里.
2 创建迁移脚本
使用migarate子命令来创建数据库迁移脚本,在此之前我们先改动一下数据库的模型来验证迁移是否成功,我们在User模型中添加age属性:
class User(db.Model) : __tablename__ = 'users' id = db.Column(db.Integer, primary_key= True) username = db.Column(db.String(64), unique=True, index= True) age = db.Column(db.String(64))我们检查下是否更新成功:
python test.py db migrate
3 数据库更新
python test.py db upgrade
成功进行了更新。
Url:http://flask-migrate.readthedocs.io/en/latest/
--转载请注明: http://91o.cc/flask-%e6%95%b0%e6%8d%ae%e5%ba%93%e8%bf%81%e7%a7%bb%e5%b7%a5%e5%85%b7-flask-migrate/