• flask框架使用flaskmigrate进行数据库的管理,非常方便!!!


    flask数据库迁移

    使用flaskSQLAlchemy的问题

    • 如果数据库里已经有A表了,然后在A类中添加字段,是不会更新添加到A表中的。

    怎么更新字段

    • 因此我们需要进行数据库的更新,可以使用flask的扩展包migrate

    安装

    • pip install Flask-Script
    • pip install flask-migrate
      PS: 注意了 Flask-Migrate 是要依赖 Flask-Script 组件的

    运行报错解决

    报错:ModuleNotFoundError:No module named ‘flask._compat’
    方法一
    原因分析:
    ModuleNotFoundError: No module named 'flask._compat
    ctrl+左键 查看manager查看源码,找到from flask._compat import text_type这行,
    按ctrl进行查看,显示找不到文件,Flask 2.0.0版本修改了。
    Flask版本过高问题:flask里面的 ._compat.py文件没有,降低版本即可。
    
    方法二:
    或者
    不使用Flask-Script,使用flask命令如下:
    初始化数据库:flask db init
    迁移新更改:flask db migrate
    升级:flask db upgrade
    还有其它命令...
    
    方法三:
    参考<https://www.cjavapy.com/article/1977/> 
    不降级则可以尝试修改一下flask_script/__init__.py中
    from ._compat import text_type 改成 from flask_script._compat import text_type 。
    
    

    使用

    from flask import Flask
    from flask_sqlalchemy import SQLAlchemy
    from flask_script import Manager
    from flask_migrate import Migrate, MigrateCommand
    
    
    app = Flask(__name__)
    
    # 创建数据库sqlalchemy工具对象
    db = SQLAlchemy(app)
    
    # 创建flask脚本管理工具对象
    manager = Manager(app)
    
    # 创建数据库迁移工具对象
    Migrate(app, db)
    
    # 向manager对象中添加数据库操作命令
    manager.add_command('db', MigrateCommand)
    
    

    示例:这是一个文件:manager.py

    from flask import Flask, render_template
    from flask_sqlalchemy import SQLAlchemy
    from flask_script import Manager
    from flask_migrate import Migrate, MigrateCommand
    
    app = Flask(__name__)
    
    
    # create database db_flask default charset utf8 collate utf8_general_ci;
    
    class Config(object):
        """配置参数"""
        SQLALCHEMY_DATABASE_URI = "mysql://root:123456@127.0.0.1:3306/db_flask"
        # 设置sqlalchemy自动跟踪数据库
        SQLALCHEMY_TRACK_MODIFICATIONS = True
    
        SECRET_KRY = '#%*(_)?./DFVDjnd34534'
    
    
    app.config.from_object(Config)
    
    # 创建数据库sqlalchemy工具对象
    db = SQLAlchemy(app)
    
    
    # 创建flask脚本管理工具对象
    manager = Manager(app)
    
    # 创建数据库迁移工具对象
    Migrate(app, db)
    
    # 向manager对象中添加数据库操作命令
    manager.add_command('db', MigrateCommand)
    
    # 创建数据库模型类
    class Role(db.Model):
        """用户角色表"""
        __tablename__ = 'tbl_roles'
    
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(32), unique=True)
        # 需要手动添加,方便使用Role.user查询用户对象,user列不是真实存在的,backref="role"为了方便通过User.role获取角色对象,
        # 因为使用User.role_id只能获取到角色id,要想获取角色对象,还需要再在Role表中查询一次
        users = db.relationship("User", backref="role")
    
        def __repr__(self):
            """定义之后,可以让显示对象的时候更直观,类似于Django中的__str__"""
            return "Rloe object: name=%s" % self.name
    
    class User(db.Model):
        """用户表"""
        __tablename__ = 'tbl_users'  # 指明数据库表名
        id = db.Column(db.Integer, primary_key=True)  # 整型主键,会默认设置为自增主键
        name = db.Column(db.String(64), unique=True)
        email = db.Column(db.String(128), unique=True)
        password = db.Column(db.String(128), nullable=False)  # nullable=False 参数必须传
        role_id = db.Column(db.Integer, db.ForeignKey("tbl_roles.id"))
    
    
    if __name__ == '__main__':
        # 通过manager对象启动程序
        manager.run()
    

    命令

    实际应用的操作步骤,参考如下:
    1.python manager.py db init
    -- 运行这个命令之后会产生一个migrations文件夹
    2.python manager.py db migrate -m"版本名(注释)"
      python manager.py db migrate # 也可以不加注释
    -- 运行这个命令之后会在migrations文件夹的versions里面产生一个版本的py文件
    3.python manager.py db upgrade 然后观察表结构
    -- 这一步就是执行的问题了,运行这个执行变更
    
    根据需求修改模型
    1.python manager.py db migrate -m"新版本名(注释)"
    2.python manager.py db upgrade 然后观察表结构
    
    若返回版本,则利用 
    python manager.py db history  查看版本号
    python manager.py db downgrade(upgrade) 版本号
    
    

    开启debug

    启Debug模式
    通过Flask-Script接管后无法直接通过app.run(debug=True)来开启Debug了,其实通过Flask-Script也可以很方便开启Debug模式。
    
    修改之前的代码:
    from flask.ext.script import Manager, Server
     
    app = Flask(__name__)
    manager = Manager(app)
    manager.add_command("runserver", Server(use_debugger=True))
    
    if __name__ == "__main__":
        manager.run()
    
    
  • 相关阅读:
    进程通信
    python模块成像库pillow
    python模块IO
    python模块StringIO和BytesIO
    DJango重写用户模型
    DJango模型Meta选项详解
    DJango中事务的使用
    批量删除文件
    批量修改文件名字或后缀
    自定义中间件实现插拔设计
  • 原文地址:https://www.cnblogs.com/andy0816/p/15525874.html
Copyright © 2020-2023  润新知