赞
踩
数据迁移的步骤
首先要在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
# 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 : 设置普通索引
在模型模式下创建数据库表会用到的一些字段类型: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)
其余程序和“Flask项目拆分”的框架中程序一样,但是要注意:在views.py 中一定要导入models模块(from .mocels import *)
# __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
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)
# 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,就是用于替代数据库,后面用到数据库相关操作,可以检索。
# 在views.py中放路由和视图函数
from flask import Blueprint, render_template
from .models import * #后面是用views来控制数据库的,所以要在views中导入models文件
# 蓝图(蓝图可以有多个,方便对路径进行区分)
blue = Blueprint('user', __name__)
@blue.route('/')
def index():
return '这是一个加了数据库模型的Flask模板'
# Flask项目模板
from App import creat_app
app = creat_app()
if __name__ == '__main__':
app.run(debug=True)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。