flask数据库迁移方法
一、集成python shell
为避免每次启动shell会话都要导入数据库实例和模型,我们可以使用app.shell_context_processer装饰器来创建并注册一个shell上下文处理器。
app.py
# -*- coding:utf-8 -*- from flask import Flask from flask_sqlalchemy import SQLAlchemy from flask_login import UserMixin import os basedir = os.path.abspath(os.path.dirname(__file__)) app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///' + os.path.join(basedir, 'data-tes.db') app.secret_key = 'asds' db = SQLAlchemy(app) # 用户表 class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(64), unique=True, index=True) username = db.Column(db.String(64), unique=True, index=True) @app.shell_context_processor def make_shell_context(): return dict(db=db, User=User) @app.route('/login') def login(): return 'login' if __name__ == '__main__': app.run()
调用示例
D:\flask\s116>flask shell Python 3.7.6 (tags/v3.7.6:43364a7ae0, Dec 19 2019, 00:42:30) [MSC v.1916 64 bit (AMD64)] on win32 App: app Instance: D:\flask\s116\instance >>> app <Flask 'app'> >>> db <SQLAlchemy sqlite:///D:\flask\s116\data-tes.db> >>> User <class 'app.User'>
二、使用flask-migrate实现数据库迁移
如果User表已经存在, 并且增加了一个字段,此时sqlalchemy只能删除此表才可以增加新字段。使用migrate可以跟踪数据库模式的变化, 将字段以增量的方式应用到数据库中。
app.py
…… from flask_migrate import Migrate migrate = Migrate(app, db)
生成数据库迁移脚本,此命令会创建migrations子目录,用于存放所有迁移脚本
使用migragte管理数据库模式变化 的步骤:
1、对模型做修改, 如增加password_hash字段
class User(UserMixin, db.Model): __tablename__ = 'users' id = db.Column(db.Integer, primary_key=True) email = db.Column(db.String(64), unique=True, index=True) username = db.Column(db.String(64), unique=True, index=True) password_hash = db.Column(db.String(128))
2、执行flask db migrate, 创建迁移脚本
D:\flask\s116>flask db migrate INFO [alembic.runtime.migration] Context impl SQLiteImpl. INFO [alembic.runtime.migration] Will assume non-transactional DDL. INFO [alembic.autogenerate.compare] Detected added column 'users.password_hash' Generating D:\flask\s116\migrations\versions\5350ab866d3e_.py ... done
3、检查自动生成的脚本, 根据对模型的实际改动进行调整
4、把迁移脚本纳入版本控制
5、执行flask db upgrade进行数据库迁移, 检查数据库中是否有新增字段
D:\flask\s116>flask db upgrade INFO [alembic.runtime.migration] Context impl SQLiteImpl. INFO [alembic.runtime.migration] Will assume non-transactional DDL. INFO [alembic.runtime.migration] Running upgrade 977684a8a090 -> 5350ab866d3e, empty message