首页 > 数据库 >flask数据库执行迁移

flask数据库执行迁移

时间:2023-02-02 15:45:09浏览次数:42  
标签:__ flask 数据库 db python 迁移

前言:

使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表。就是将关系型数据库的一张张表转化成了Python的一个个类。
在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库,最简单粗暴的方式就是删除旧表,然后在增加新表,这样做的缺点是会造成数据丢失。
使用数据库迁移,可以追踪数据库模式的变化,然后把变动应用到数据库中。
在flask中使用Flask-Migrate来实现数据库迁移,并且集成到Flask-Script中,所有的操作通过命令来完成。
为了导出数据库迁移命令,Flask-Migrate使用了一个MigrateCommand类,可以附加到Flask-Script的manager对象上。
安装Flask-Migrate

pip install flask-migrate
Python代码,用户类和角色类。

#!/usr/bin/python
#coding:utf-8

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_script import Manager
from flask_migrate import Migrate,MigrateCommand

"""
flask_migrate作用:
1、通过命令的方式创建表
2、修改表的结构
"""

class Config(object):
SQLALCHEMY_DATABASE_URI = "mysql+mysqlconnector://root:******@127.0.0.1:3306/mhq_blog"
# 这个值可以设置,也可以不设置,如果不设置,那么会一直报警告
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 这里有个坑,下次再讲
SQLALCHEMY_COMMIT_ON_TEARDOWN = True

app = Flask(__name__)
app.config.from_object(Config)

db = SQLAlchemy(app)
manager = Manager(app)

# 第一个参数是flask实例,第二个参数SQLAlchemy实例
Migrate(app, db)

#manager是Flask-Script的实例,这条语句在flask-Script中添加一个db命令
manager.add_command("db", MigrateCommand)


class Role(db.Model):
__tablename__ = "roles"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128))
title = db.Column(db.String(128))
us = db.relationship("User",backref="role")

class User(db.Model):
__tablename__="users"
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(128))
email = db.Column(db.String(128))
password = db.Column(db.String(128))
role_id = db.Column(db.Integer,db.ForeignKey("roles.id"))

@app.route("/")
def index():
return "index"

if __name__ == '__main__':
manager.run()
迁移数据库三步走:

第一步:创建迁移仓库

python manage.py db init

这里的db是迁移命令的对象,名字可以随便取,但是需要保持一致。

这个命令会创建migrations文件夹,所有迁移文件都放在里面。

这里只是创建了迁移仓库,表还没创建。


可以看到表还没有创建。


第二步:创建迁移脚本

自动创建迁移脚本有两个函数
upgrade():函数把迁移中的改动应用到数据库中。
downgrade():函数则将改动删除。
自动创建的迁移脚本会根据模型定义和数据库当前状态的差异,生成upgrade()和downgrade()函数的内容。
对比不一定完全正确,有可能会遗漏一些细节,需要进行检查


运行命令之后,只是在migrations文件夹中新增了数据库迁移的版本文件并没有在数据库也只是创建了版本号,并没有生成对应的表。

 

第三步:更新数据库

更新数据库命令:

python manage.py db upgrade


将代码中的title删除,然后再次执行迁移脚本命令

python manage.py db migrate -m 'del_title'

这个时候数据库中title字段还没有被删除


执行更新数据库操作:

python manage.py db upgrade

实际操作顺序:
1.python 文件 db init
2.python 文件 db migrate -m"版本名(注释)"
3.python 文件 db upgrade 然后观察表结构
4.根据需求修改模型
5.python 文件 db migrate -m"新版本名(注释)"
6.python 文件 db upgrade 然后观察表结构
7.若返回版本,则利用 python 文件 db history查看版本号
8.python 文件 db downgrade(upgrade) 版本号

标签:__,flask,数据库,db,python,迁移
From: https://www.cnblogs.com/JentZhang/p/17086236.html

相关文章

  • 【达梦数据库】MySQL 的ON DUPLICATE KEY UPDATE语句在达梦数据库中使用的方式
    背景想要做数据同步,但不知道待同步的数据是新增或更新于是想,如果数据库可以识别InsertOrUpdate就好了使用的是达梦数据库but:1、达梦是没有ONDUPLICATEKEYUPDAT......
  • Otter实现mysql数据库指定多个表实时单向同步
    背景生产库接入太多应用程序,现需要搭建从库用于测试并数据分析,由于并发量大,mysql自带的主从同步存在瓶颈,主从同步延迟增大,因此通过otter的方案实现主从同步。计划192.16......
  • 数据库:事务基础知识
    事务概述存储引擎支持情况可以使用SHOWENGINES命令查看Mysql支持事务的存储引擎有哪些。Mysql中只有InnoDB支持事务。基本概念事务:一组逻辑操作单元,使数据从一种状......
  • mysql数据库时间类型数据存储建议
    本文转载自:https://javaguide.cn/database/mysql/some-thoughts-on-database-storage-time.html 我们平时开发中不可避免的就是要存储时间,比如我们要记录操作表中这条记......
  • sql_server数据库
    问题:如何在SQLSERVER中合并时间和日期?解决方法1:使用+合并时间日期让我们运行以下命令:SELECTCAST(字段名ASDATETIME)+CAST(字段名ASDATETIME)AS[CombineDateTime......
  • 若依-更换数据库-sqlite
    基础我是在ruoyi-vue已经安装了mybatis-plus的基础上进行的修改关于SQLiteSQLite是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎。SQ......
  • 08-数据库信息展示
    数据信息展示#知识点:#1.获取数据库所有内容list=PersonInfo.objects.all()#2.html中的for循环{%forlsinlist%}<tr><td>{......
  • UE4将蓝图从一个项目迁移到
    一、蓝图迁移蓝图迁移很简单,在内容中选中你的蓝图文件夹,鼠标右键->迁移,选择你要嵌入的工程的content文件夹,完成迁移。二、迁移后带来的问题如上图所示,将蓝图迁......
  • 《Flask Web开发》-第零章-前言
    Flask是一个使用Python编写的轻量级Web应用框架。优点是让开发者做主,使其对应用拥有全面的创意控制。能给用户提供很大的自由度,其关键在于开发时就考虑到了扩展性最好......
  • Springboot数据库配置文件加密
    引入工具依赖包:!--配置文件加密--><dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>1.......