zoukankan      html  css  js  c++  java
  • 06flask_migrate

    1,flask-migrate介绍:

      因为采用db.create_all()在后期修改字段的时候不会自动的映射到数据库中,必须删去表,然后运行,所以我们用flask-migrate来映射。

    db.create_all()才会重新映射,这样不符合我们的需求,因此flask-migrate就是为了解决这个问题,他可以在
    每次修改模型后,可以将修改的东西映射到数据库中。

    2,如下图,当用户请求服务器时,那flask服务器会将当前app推入app栈中,所以当用“db.init_app(app)”的“db”的变量(这个db可以初始化很多app,所以得具体指定出当前app,这时候需要入栈),他就会从栈里去取栈顶的元素,拿到之后再给他初始化。当没有用户访问服务器时,相当于没执行视图函数,即app没放在app栈中,这时候读取的就是空的东西,
    “with app.app_context():

           db.create_all()”相当于手动入栈的过程。

    结果对比:

    那么这和我们的迁移有什么关系呢?

    请看下面的问题:

    我想在下面的模型里加一个字段telephone:

    from exts import db
    
    class Author(db.Model):
        __tablename__  = "author"
        id = db.Column(db.Integer,primary_key=True,autoincrement=True)
        name = db.Column(db.String(100),nullable=False)

    那么我直接在下面加再运行代码会出问题,因为已经生成的数据模型不能再更改,所以这里需要用到数据迁移:

     

    在model中添加telephone后在迁移并映射后变为:

    代码:

    app.py
    from
    flask import Flask from models import Author from exts import db import config app = Flask(__name__) app.config.from_object(config) db.init_app(app) # db.create_all() # with app.app_context(): # db.create_all() # migrate步骤2: # 当manage.py/“migrate步骤”中执行后,上面两句就可以不要了。 @app.route('/') def hello_world(): return 'Hello World!' if __name__ == '__main__': app.run()
    exts.py
    from
    flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()
    models.py
    from
    exts import db class Author(db.Model): __tablename__ = "author" id = db.Column(db.Integer,primary_key=True,autoincrement=True) name = db.Column(db.String(100),nullable=False) # migrate步骤3: telephone = db.Column(db.String(11),nullable=False)
    
    
    migrate.py
    from flask_script import Manager
    from app import app
    from exts import db
    from flask_migrate import Migrate,MigrateCommand
    from models import Author
    
    # migrate步骤1:
    # 模型 -->  迁移 -->  表,分别用下面语句实现
    # “python manage.py db init”   --> “python manage.py db migrate”   -->  “python manage.py db upgrade”
    # 作用分别是1,初始化一个迁移环境。2,做出一个迁移表。3,映射成表。
    
    # migrate步骤4:
    #  “python manage.py db migrate”   -->  “python manage.py db upgrade”
    
    
    manager = Manager(app)
    
    migrate = Migrate(app,db)
    
    manager.add_command("db",MigrateCommand)
    
    if __name__ == '__main__':
        manager.run()
    config.py
    # encoding:utf-8
    #dialect+driver://username:password@host:port/database
    # dialect:是数据库的实现,比如MySql,SQLlite,且转换为小写
    # driver:对应的驱动,比如MySql的驱动是MySqldb
    # username:连接数据库的用户名
    # password:密码
    # host:连接数据库的域名
    # port:数据库监听的端口号
    # database:是连接的数据库的名字,创建数据库语句为:
    """create database db_demo1(database_name) charset utf8;"""
    
    # 如果以上输出了1则说明SQLAlchemy能成功连接到数据库。
    
    DIALECT = "mysql"
    DRIVER = "mysqldb"
    USERNAME = "root"
    PASSWORD = '1234'
    HOST = "127.0.0.1"
    PORT = "3306"
    DATABASE = "db3"
    
    SQLALCHEMY_DATABASE_URI="{}+{}://{}:{}@{}:{}/{}".format(DIALECT,DRIVER,USERNAME,PASSWORD,HOST,PORT,DATABASE)
    """指定一个名为SQLALCHEMY_DATABASE_URI的固定变量,注意是固定的写法"""
    SQLALCHEMY_TRACK_MODIFICATIONS =False
  • 相关阅读:
    Java基础(五):数组和Java方法
    Java基础(四):Java Number & Math 类、Character 类、String 类、StringBuffer & StringBuilder 类
    Java基础(三):修饰符、运算符、循环结构和分支结构
    Java基础(二):基本数据类型和变量类型
    Java基础(一):简介
    变量声明置顶规则、函数声明及函数表达式和函数的arguments属性初始化
    JS操作JSON常用方法
    站点的良好体验在网络优化中极为重要
    JVM基础(二) 实现自己的ClassLoader
    [DLX精确覆盖] hdu 3663 Power Stations
  • 原文地址:https://www.cnblogs.com/two-peanuts/p/10733863.html
Copyright © 2011-2022 走看看