zoukankan      html  css  js  c++  java
  • Flask-Migrate拓展数据库表结构

    # 转载请留言联系

    在我们用 sqlchemy 模块创建完几个表时,如果在实际生产环境中,需要对表结构进行更改,应该怎么办呢?总不能把表删除了吧,这样数据就会丢失了。

    更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中。

    在Flask中可以使用Flask-Migrate扩展,来实现数据迁移。并且集成到Flask-Script中,所有操作通过命令就能完成。

    • 操作示例:

    1.首先需要安装 flask-migrate 模块,当然还有 flask-script 模块。

    pip3 install flask-migrate

    pip3 install flask-script

    2.代码:

     1 #coding=utf-8
     2 from flask import Flask
     3 
     4 from flask_sqlalchemy import SQLAlchemy
     5 from flask_migrate import Migrate,MigrateCommand
     6 from flask_script import Shell,Manager
     7 
     8 app = Flask(__name__)
     9 manager = Manager(app)
    10 
    11 app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://root:mysql@127.0.0.1:3306/Flask_test'
    12 app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
    13 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True
    14 db = SQLAlchemy(app)
    15 
    16 #第一个参数是Flask的实例,第二个参数是Sqlalchemy数据库实例
    17 migrate = Migrate(app,db) 
    18 
    19 #manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
    20 manager.add_command('db',MigrateCommand)
    21 
    22 #定义模型Role
    23 class Role(db.Model):
    24     # 定义表名
    25     __tablename__ = 'roles'
    26     # 定义列对象
    27     id = db.Column(db.Integer, primary_key=True)
    28     name = db.Column(db.String(64), unique=True)
    29     user = db.relationship('User', backref='role')
    30 
    31     #repr()方法显示一个可读字符串,
    32     def __repr__(self):
    33         return 'Role:'.format(self.name)
    34 
    35 #定义用户
    36 class User(db.Model):
    37     __talbe__ = 'users'
    38     id = db.Column(db.Integer, primary_key=True)
    39     username = db.Column(db.String(64), unique=True, index=True)
    40     #设置外键
    41     role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
    42 
    43     def __repr__(self):
    44         return 'User:'.format(self.username)
    45 
    46 
    47 if __name__ == '__main__':
    48     manager.run()

    主要注意第8行-20行,48行。要把原来的代码改成这样。

    3.命令行的操作

    • 创建迁移仓库

    # 这个命令会创建 migirations 文件夹,所有迁移文件都放在里面

    python3 xxx.py db init

    注:db 是20行决定了,可以更改

    • 自动创建迁移脚本

    python3 xxx.py db migrate -m"版本名(注释)"

    • 更新数据库

    python3 xxx.py db upgrade

    • 当我们需要修改表结构时,直接在 xxx.py 里直接增删相应的代码
    • 修改完成后,继续创建新的迁移脚本

    python 文件 db migrate -m"新版本名(注释)"

    • 更新数据库

    python3 xxx.py db upgrade

    更新完之后,其实就是提交操作,类似于 git 添加一个新的版本。

    但是,如果我们想返回历史的版本,应该怎么操作呢?

    • 先查看版本号

    python xxx.py db history

    然后记住想要返回的版本号。

    • 返回指定的版本

    python xxx.py db downgrade(upgrade) 版本号

    然后打开你的代码,可以发现他自动复原了!

  • 相关阅读:
    双态运维分享之:业务场景驱动的服务型CMDB
    双态运维分享之二: 服务型CMDB的消费场景
    双态运维:如何让CMDB配置维护更贴近人性
    CMDB经验分享之 – 剖析CMDB的设计过程
    APM最佳实践: 诊断平安城市视频网性能问题
    先定一个运维小目标,比方监控它10000台主机
    大规模Docker平台自动化监控之路
    少走冤枉路!带你走过SNMP的那些坑
    完整性约束
    数据类型
  • 原文地址:https://www.cnblogs.com/chichung/p/9796412.html
Copyright © 2011-2022 走看看