当前位置:   article > 正文

★Python轻量级Web框架Flask(5)——Flask模型基础 / 数据迁移 / 包含数据库的模板_flask数据迁移

flask数据迁移

0、前言:

  • 学习这部分的前提是对python的面向对象有一定的了解,同时对MySQL有扎实的学习
  • Flask中数据迁移的目的:把写在Flask当中的模型转化为数据库当中的表。
  • 注意这篇文章数据迁移是通过SQLite实现的,通过MySQL实现数据迁移见下一篇文章!

1、Flask模型基础知识:

  • Flask模型
    在这里插入图片描述
  • ORM
    在这里插入图片描述
    (注意:在flask中用ORM可以实现SQL语句功能,但是并不意味着SQL语句不重要!)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 需要安装的包
    在这里插入图片描述
    注意:在pip 下载的时候后面通过 -i 加的url是源,目的是提高下载速度
    注意:Flask是一个轻量级框架,它的很多功能都需要用插件

2、数据迁移:通过SQLalchemy能够让python中的类变成Flask中的模型,而数据迁移就是要让模型变成数据库当中的表。

  • 数据迁移的步骤

    • 1、安装好数据迁移包:flask-sqlalchemy 和 flask-migrate
    • 2、在exts.py 中初始化Migrate 和 SQLALchemy(ext.py 是设计出来专门存放flask插件的)
    • 3、在models 中定义好模型(见下面model中代码)
    • 4、在views.py 中一定要导入models模块(from .mocels import *)
    • 5、配置好数据库(sqlite3或MySQL,见下面__init__中的代码)
    • 6、执行数据迁移命令:(可以用:cd 路径 或 直接拖)
      • 首先要在cmd或pycharm的terminal进入项目目录(app.py所在的目录):
        在这里插入图片描述

      • 指令输入:

      • flask db init 创建迁移文件夹migrates,只有在初始时调用一次

      • flask db migrate 生成迁移文件(会把继承自db.Model的类对应的内容转换为SQL语句)

      • 下面这个操作只是针对使用的数据库是SQLite时使用!!!
        在这里插入图片描述
        在这里插入图片描述
        注意:这里我等好半天,才下载好驱动,多等会。
        在这里插入图片描述
        上面的所有步骤完成之后,就可以继续执行下面的代码了。

      • flask db upgrade 执行迁移文件中的升级
        在这里插入图片描述
        此时就能清晰看到表结构了,但是如果在model中修改了表结构,在数据库视图中是不会改变的,要想要数据库视图跟着改,就要做表迁移,所以最好一次就把表写好。【模型一旦改掉,就要做数据迁移,这样数据库当中的表才会跟着改动】
        重新迁移的方法: flask db migrate,执行完之后就能在文件列表的migrations中的versions中看到生成的新的py文件,打开该文件还能看到它上一个版本或者下一个版本,而且该文件的upgrade会记录发生的改变,然后执行 flask db upgrade 再回数据库中刷新下,就能看到数据库也会发生改变,如果要返回上一个版本,就再次执行flask db downgrade,然后刷新数据库就能看到数据库回到了上一个版本。如果执行了flask db downgrade 还想回到撤销前,就可以接着执行flask db downgrade,不用再执行flask db migrate了

      • flask db downgrade 相当于撤销对数据库执行的升级,如果执行了该命令,就要注意数据库和模型中的数据可能不同步的问题!

  • 数据迁移文件框架(该框架还是套用了“Flask项目拆分”的框架):下面的App文件中有:static文件夹、templates文件夹、init.py、models.py、views.py、exts.py(放插件)。下面instance文件夹是数据迁移初始化时自动生成的。
    在这里插入图片描述

  • __init __ 程序

# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .views import blue
from .exts import init_exts

def creat_app():
    app = Flask(__name__)

    # 注册蓝图
    app.register_blueprint(blueprint=blue)

    # 配置数据库
    db_uri = 'sqlite:///sqlite3.db'
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False    # 禁止对象追踪修改(为了不浪费服务器资源进行的设置)

    # 初始化插件
    init_exts(app=app)

    return app

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • models 程序
# models.py : 模型,数据库

'''
    模型      ===      数据库
    类        ——>     表结构
    类属性     ——>    表字段
    一个对象   ——>    表的一行数据
'''


from .exts import db # 导入db对象就能通过python实现ORM技术,避免了写SQL语句。

# 模型Model:类
# 必须继承 db.Model User才能从普通的类变成模型
class User(db.Model):
    # 表名
    __tablename__ = 'tb_user'   # 数据迁移就是让模型变成表,ORM就是让类变成模型
    # 定义表字段
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True, index=True)
    age = db.Column(db.Integer, default=1)
    sex = db.Column(db.Boolean, default=True)
    salary = db.Column(db.Float, default=100000, nullable=False)


# db.Column : 表示字段
# db.Integer : 表示整数
# primary_key=True : 主键
# autoincrement=True : 自增长
# db.String(30) : 可变字符串
# unique=True : 唯一约束
# index=True : 设置普通索引

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 在模型模式下创建数据库表会用到的一些字段类型:Integer、Float、String、等其他类型;常用约束:primary_key、autoincrement、unique、index、nulllable、default;数据表操作:创建数据库,表 db.create_all()、删除表 db.drop_all()、在事务中处理,数据插入 db.session.add(object) \ db.session.commit();

  • exts 程序

# exts.py:插件管理
# 拓展第三方插件

# 1. 导入第三方插件
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

# 2. 初始化
db = SQLAlchemy()   # ORM
migrate = Migrate() # 数据迁移

# 3. 和app对象绑定
def init_exts(app):
    db.init_app(app=app)
    migrate.init_app(app=app, db=db)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

其余程序和“Flask项目拆分”的框架中程序一样,但是要注意:在views.py 中一定要导入models模块(from .mocels import *)


3、数据迁移总结性说明(虽然上面步骤中有,但我觉得有必要总结说一下):

  • 上面的步骤看着非常复杂,期间还夹杂一些插件下载操作。
  • 当我们真的配置好flask模型之后,每次调用无非就是复制模型,然后在模型的基础上添加内容,之后的数据迁移就很简单了。
  • 有了模型之后的数据迁移:
    • 1、在models中写好数据表结构
    • 2、打开pycharm的终端,将整个项目文件拖进pycharm的终端(目的是从该项目文件中打开终端)
    • 3、在终端执行:flask db init 创建迁移文件夹migrates,只有在初始时调用一次,执行之后就会在项目列表中出现一个migrations文件夹。
    • 4、在终端执行:flask db migrate 生成迁移文件(会自动找到继承自db.Model的类,把对应的内容转换为SQL语句),执行完该语句就会在migrations文件夹中的versions文件夹生成一个py文件,这个py文件就是迁移文件,在instance中就会出现一个sqlite数据库,在pycharm侧边栏有个Database选项,进入后选择对应的sqlite,如果提示安装驱动,就点击安装,然后就能把项目中instance文件夹里的sqlite3.db文件拖动到侧边栏Database。
    • 5、在终端执行:flask db upgrade 该命令执行结束后,就会让上一步得到的versions中的py迁移文件中的upgrade操作执行,表就会生成,但是表中这个时候是没有数据的。(此时就能从pycharm侧边栏的Database中看到你数据库中的表,以及一些生成表的记录)如果要对表进行“增删改查”要进入views中进行操作。注意,如果在models中修改了模型,数据库表是不会改变的,只有再次执行第4步和第5步迁移命令(如果在已经有了迁移文件的情况下,就不用再执行第4步了),数据库才会跟着改。
    • 6、在终端执行:flask db downgrade 就会撤销上一步的upgrade,相当于回退一步命令。

4 、包含数据库的模板(后期开发的时候直接复制就好了)

  • 0、前言:之前的“Python轻量级Web框架Flask(2)——Flask模板渲染/Flask项目拆分模板”当中的模板是包含数据库模板的基础
  • 1、展示模板结构:注意里面的instance是在exts中配置了数据迁移Migrate后,执行项目后自动生成的,不用自己新建,其他需要自己新建的文件下面会给出内容,static和templates文件夹是需要自己新建的。
    在这里插入图片描述
  • 1.1、__init __.py:
# __init__.py : 初始化文件,创建Flask应用
from flask import Flask
from .views import blue
from .exts import init_exts

def creat_app():
    app = Flask(__name__)

    # 注册蓝图(将views中的蓝图和对应app绑定,可能会存在有多个app的情况)
    # 蓝图就是为了便于模块化管理和拓展应用,蓝图会给每个url加上前缀
    app.register_blueprint(blueprint=blue)

    # 配置数据库(配置不同数据库软件,就要用不同配置,配置的目的,就是在用到数据库的时候让项目知道找什么数据库,去哪找数据库)
    db_uri = 'sqlite:///sqlite3.db'
    # db_uri = 'mysql+pymysql://root:123456@localhost:3306/flaskdb' # mysql的配置
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 禁止对象追踪修改(为了不浪费服务器资源进行的设置)

    # 初始化插件(必须写在配置数据库之后!!)
    init_exts(app=app)

    return app
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 1.2、exts.py:
from flask_sqlalchemy import SQLAlchemy # orm技术
from flask_migrate import Migrate # 数据迁移技术

db = SQLAlchemy()
migrate = Migrate()

def init_exts(app):
    db.init_app(app=app)
    migrate.init_app(app=app, db=db)


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1.3、models.py:
# models.py : 模型,数据库

'''
    模型      ===      数据库
    类        ——>     表结构
    类属性     ——>    表字段
    一个对象   ——>    表的一行数据
'''


from .exts import db # 导入db对象就能通过python实现ORM技术,避免了写SQL语句。

# 模型Model:类
# 必须继承 db.Model User才能从普通的类变成模型
class User(db.Model):
    # 表名(这里如果不写表名,就会默认是该模型类名的小写)
    __tablename__ = 'tb_user'   # 数据迁移就是让模型变成表,ORM就是让类变成模型
    # 定义表字段
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True, index=True)
    age = db.Column(db.Integer, default=1)
    # 通过orm技术得到的db,就是用于替代数据库,后面用到数据库相关操作,可以检索。


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 1.4、views.py:
# 在views.py中放路由和视图函数

from flask import Blueprint, render_template
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件

# 蓝图(蓝图可以有多个,方便对路径进行区分)
blue = Blueprint('user', __name__)

@blue.route('/')
def index():
    return '这是一个加了数据库模型的Flask模板'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1.5、app.py:
# Flask项目模板
from App import creat_app

app = creat_app()


if __name__ == '__main__':
    app.run(debug=True)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

总结:

  • 1、数据迁移本质就是通过Flask中的ORM(对象关系映射)技术的一个环节,由Flask中的模型通过我们熟悉的python的类和属性的方式创建数据库,然后,再将这种方式创建的数据库,通过数据迁移的方式更新到项目数据库当中,实现了对项目数据库的间接访问。
  • 2、数据迁移流程:导入插件 —— 将插件初始化 —— 插件与app绑定 —— 调用插件创造模型(通过这一步骤实现ORM技术,避免了使用SQL语句)—— 在pycharm终端初始化migrate —— 在pycharm终端给项目生成迁移文件 —— 在pycharm终端实现数据迁移(迁移错误,还可以回退)
  • 3、最后说明下,结合“Python轻量级Web框架Flask(2)——Flask模板渲染/Flask项目拆分模板”的模板,跟着本文内容调整,完全可以顺利实现数据迁移。
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号