flask 数据库迁移

flask 数据库迁移

  • 安装
  • flask_script 的使用
  • flask-migrate 的配置
  • 总的代码:
  • 实际操作顺序

  • 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库。最直接的方式就是删除旧表,但这样会丢失数据。
  • 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。
  • 在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。
  • 为了导出数据库迁移命令,Flask-Migrate提供了一个MigrateCommand类,可以附加到flask-script的manager对象上。

安装

pip install flask-migrate
pip install flask_script

flask_script 的使用

配置

from flask_script import Manager

manager = Manager(app)

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

修改为上面的代码后, 就可以i使用python xx.py runserver -p 5000 来启动服务器

flask-migrate 的配置

from flask_migrate import Migrate, MigrateCommand
migrate = Migrate(app, db) # 设置迁移Migrate对象, 第一个参数是app 应用, 第二个是数据库操作句柄
manager.add_command('db', MigrateCommand)  # 这里的db 就是命令行里的db

总的代码:

from flask import Flask

from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand


app = Flask(__name__)

# 创建一个管理数据库对象
app.config['SECRET_KEY'] = 'arandomstring'


DIALCT = "mysql"
DRIVER = "pymysql"
USERNAME = "root"
PASSWORD = "123456"
HOST = "127.0.0.1"
PORT = "3306"
DATABASE = "flasktestdb"

DB_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALCT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
app.config["SQLALCHEMY_DATABASE_URI"] = DB_URI

app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True


# 创建一个管理数据库对象,注意参数需要和app产生联系
db = SQLAlchemy(app) # 数据库操作句柄
manager = Manager(app)
migrate = Migrate(app, db) # 设置迁移Migrate对象, 第一个参数是app 应用, 第二个是数据库操作句柄

manager.add_command('db', MigrateCommand)  # 这里的db 就是命令行里的db


class Role(db.Model):
    __tablename__ =  'roles'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20), unique=True)

    # 在主表加关系, 与用户表产生关系,代表的是这个下面的所以用户
    users = db.relationship('NewUser', backref='role', lazy='dynamic') # 用到了才加载
    # users = db.relationship('NewUser', backref='role', lazy='subquery') # 全部加载
    def __repr__(self):
        return '' % self.name



class NewUser(db.Model):
    # 定义表名
    __tablename__ = 'newusers'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(20), nullable=False)
    is_delete = db.Column(db.Boolean, default=False)
    email = db.Column(db.String(30), nullable=True)

    # 外键, 添加外键的时候要指定表名和字段
    role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))

    def __repr__(self):
        return '' % self.name




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

实际操作顺序

  1. python 文件 db init
  2. python 文件 db migrate -m “注释”
  3. python 文件 db upgrade
  4. 根据需求修改模型
  5. python 文件 db migrate -m “注释”
  6. python 文件 db upgrade
  7. 如果修改错误,需要返回版本
  8. python 文件 db history
  9. python 文件 db downgrade 版本号

你可能感兴趣的:(Flask)