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

 

posted on 2022-10-31 10:39  孔扎根  阅读(828)  评论(0编辑  收藏  举报

导航