zoukankan      html  css  js  c++  java
  • Flask flask-migrate 数据库迁移

    简介

    flask-migrate是flask的一个扩展模块,主要是扩展数据库表结构的.

    官方文档:http://flask-migrate.readthedocs.io/en/latest/

     

    使用

    使用一共分为三步:

    创建迁移环境->生成迁移脚本->更新数据库

    本地数据库连接与相关配置文件 config.py

    import os
    ​
    ​
    DEBUG = True
    # DEBUG = False
    SECRET_KEY = os.urandom(24)
    ​
    # HOSTNAME = 'mysql'
    HOSTNAME = '127.0.0.1'
    PORT = '3306'
    DATABASE = 'autumnwater'
    USERNAME = 'root'
    PASSWORD = 'root'
    ​
    SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT,
                                                                                   DATABASE)
    ​
    SQLALCHEMY_TRACK_MODIFICATIONS = False

    数据库迁移文件 manage.py

    from flask_script import Manager
    from flask_migrate import MigrateCommand, Migrate
    from index import app
    from exts import db
    ​
    #    存放命令脚本
    ​
    manager = Manager(app)
    ​
    # 使用Migrate绑定app和db
    migrate = Migrate(app, db)
    ​
    # 添加迁移脚本的命令到manager中
    manager.add_command('db', MigrateCommand)
    ​
    if __name__ == '__main__':
        manager.run()

    如果没有下载flask-migrate会报错,使用pip下载,下载后可查看已安装库文件:

    执行命令

    python manage.py db init   
    #初始化数据库,会创建一个migations文件夹,并且会在数据库中生成一个alembic_version表
    python manage.py db migrate  
    #创建迁移历史(迁移脚本)
    python manage.py db upgrade  
    #更新数据库

    注:只有在第一次迁移的时候需要初始化数据库

    具体步骤如下:

    1. 在MySQL中创建数据库,此处我们的数据库名为:autumnwater

    2. 使用命令

      python manage.py db init

      初始化数据库,会创建一个migations文件夹,该文件夹是Alembic模块自动创建的,默认名字叫migrations,可以在创建migrate=Migrate(app,db)对象时传入directory="filename"参数来自定义目录名

      migrations 里面有一个versions文件夹,这个文件夹用来存放迁移脚本,执行迁移命令后会自动生成迁移脚本保存在里面

      同时会在数据库中生成一个alembic_version表

      我这里是python3的环境,所以上述命令 python -> python3

      同时可见migations文件夹已生成:

    3. 使用命令

      python manage.py db migrate

      创建迁移历史(迁移脚本),可以通过 -m 参数添加迁移信息,类似于git提交代码时添加提交信息,例如:

      python manage.py db migrate -m "create table"

      执行该步骤时显示

      解决方案寻找:

      https://blog.csdn.net/qq_41389354/article/details/104254677

      直接使用pip install pymysql即可

      又出现新的错误

      截取部分报错为:

      sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table 'performance_schema.session_variables' doesn't exist") [SQL: SHOW VARIABLES LIKE 'sql_mode'] (Background on this error at: http://sqlalche.me/e/13/f405)

      在 stackoverflow 上找到解决方案:

      https://stackoverflow.com/questions/31967527/table-performance-schema-session-variables-doesnt-exist

      进入mysql的bin目录下,打开cmd运行:

      mysql_upgrade -u root -p --force

      出现该问题的原因应该是之前我将phpstudy里面的mysql强制升级为了5.7版本

      重启phpstudy,然后重新运行

      python manage.py db migrate

      如图:

       

    4. 最后更新数据库,完成迁移

      python manage.py db upgrade

      查看数据库的表

      如图,执行 upgrade 命令后,会在数据库中创建一张 alembic_version 表,这张表不是代码中定义的,是 Alembic 自动创建的(看名字就知道了),里面保存的是当前数据库的版本 id

      alembic_version 表不能删除,删除后就不能继续执行数据库迁移操作了,除非重新初始化。

      同时,执行 upgrade 命令后,会根据代码中定义的模型类创建对应的表,表的字段与模型类中定义的一致。

      如上面的数据库中创建了user表,因为在我的models里面定义了该表:

      from exts import db
      from datetime import datetime
      from werkzeug.security import generate_password_hash, check_password_hash
      ​
      ​
      class User(db.Model):
          __tablename__ = 'user'
          id = db.Column(db.Integer, primary_key=True, autoincrement=True)
          email = db.Column(db.String(20), nullable=False)
          username = db.Column(db.String(50), nullable=False)
          pw_hash = db.Column(db.String(128), nullable=False)
      ​
          def __init__(self, email, username, password):
              self.email = email
              self.username = username
              self.set_password(password)
      ​
          def set_password(self, password):
              self.pw_hash = generate_password_hash(password)
      ​
          def check_password(self, password):
              return check_password_hash(self.pw_hash, password)

      而如果数据库中有其他表(没有对应模型类的表),会被删除。这点需要特别注意,数据库迁移时最好使用一个新的数据库(不要与其他项目用同一个数据库),避免造成数据丢失。

     

    优势

    个人直观感受使用数据库迁移的优势有:

    • 使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表。就是将关系型数据库的一张张表转化成了Python的一个个类。

      这里即我们之前在 models.py 文件中创建的类,可以通过数据库迁移直接生成表

    • 在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库,最简单粗暴的方式就是删除旧表,然后在增加新表,这样做的缺点是会造成数据丢失。在 Flask 中,可以使用数据库迁移来解决这个问题,数据库迁移可以追踪数据模型类的变化,然后把变动应用到数据库中,不会删表造成数据丢失。

     

    大部分参考COPY

    https://www.cnblogs.com/jiangchunsheng/p/9218338.html

    https://blog.csdn.net/weixin_43790276/article/details/103554632

    https://www.jianshu.com/p/70cc32d9d2ff

  • 相关阅读:
    算法导论2.37答案
    算法导论2.37的算法
    heavy dark读《《暗时间》》
    深入SetOP2函数
    c++标准库都有哪些文件
    c++ sort函数的用法
    深入char转换为int/unsigned int的内部机制分析
    顺序容器之vector
    java的动态代理机制详解
    java.lang.IllegalStateException: Web app root system property already set to different value
  • 原文地址:https://www.cnblogs.com/Cl0ud/p/13702635.html
Copyright © 2011-2022 走看看