Flask flask-migrate 数据库迁移
简介
flask-migrate是flask的一个扩展模块,主要是扩展数据库表结构的.
官方文档:http://flask-migrate.readthedocs.io/en/latest/
使用:
使用一共分为三步:
创建迁移环境->生成迁移脚本->更新数据库
本地数据库连接与相关配置文件 config.py
import os
DEBUG = True
# DEBUG = False
SECRET_KEY = os.urandom(24)
# HOSTNAME = 'mysql'
HOSTNAME = '127.0.0.1'
PORT = '3306'
DATABASE = 'autumnwater'
USERNAME = 'root'
PASSWORD = 'root'
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format(USERNAME, PASSWORD, HOSTNAME, PORT,
DATABASE)
SQLALCHEMY_TRACK_MODIFICATIONS = False
数据库迁移文件 manage.py
from flask_script import Manager
from flask_migrate import MigrateCommand, Migrate
from index import app
from exts import db
# 存放命令脚本
manager = Manager(app)
# 使用Migrate绑定app和db
migrate = Migrate(app, db)
# 添加迁移脚本的命令到manager中
manager.add_command('db', MigrateCommand)
if __name__ == '__main__':
manager.run()
如果没有下载flask-migrate会报错,使用pip下载,下载后可查看已安装库文件:
执行命令
python manage.py db init
#初始化数据库,会创建一个migations文件夹,并且会在数据库中生成一个alembic_version表
python manage.py db migrate
#创建迁移历史(迁移脚本)
python manage.py db upgrade
#更新数据库
注:只有在第一次迁移的时候需要初始化数据库
具体步骤如下:
在MySQL中创建数据库,此处我们的数据库名为:autumnwater
使用命令
python manage.py db init
初始化数据库,会创建一个migations文件夹,该文件夹是Alembic模块自动创建的,默认名字叫migrations,可以在创建migrate=Migrate(app,db)对象时传入directory="filename"参数来自定义目录名
migrations 里面有一个versions文件夹,这个文件夹用来存放迁移脚本,执行迁移命令后会自动生成迁移脚本保存在里面
同时会在数据库中生成一个alembic_version表
我这里是python3的环境,所以上述命令 python -> python3
同时可见migations文件夹已生成:
使用命令
python manage.py db migrate
创建迁移历史(迁移脚本),可以通过 -m 参数添加迁移信息,类似于git提交代码时添加提交信息,例如:
python manage.py db migrate -m "create table"
执行该步骤时显示
解决方案寻找:
https://blog.csdn.net/qq_41389354/article/details/104254677
直接使用pip install pymysql即可
又出现新的错误
截取部分报错为:
sqlalchemy.exc.ProgrammingError: (pymysql.err.ProgrammingError) (1146, "Table 'performance_schema.session_variables' doesn't exist") [SQL: SHOW VARIABLES LIKE 'sql_mode'] (Background on this error at: http://sqlalche.me/e/13/f405)
在 stackoverflow 上找到解决方案:
https://stackoverflow.com/questions/31967527/table-performance-schema-session-variables-doesnt-exist
进入mysql的bin目录下,打开cmd运行:
mysql_upgrade -u root -p --force
出现该问题的原因应该是之前我将phpstudy里面的mysql强制升级为了5.7版本
重启phpstudy,然后重新运行
python manage.py db migrate
如图:
最后更新数据库,完成迁移
python manage.py db upgrade
查看数据库的表
如图,执行 upgrade 命令后,会在数据库中创建一张 alembic_version 表,这张表不是代码中定义的,是 Alembic 自动创建的(看名字就知道了),里面保存的是当前数据库的版本 id
alembic_version 表不能删除,删除后就不能继续执行数据库迁移操作了,除非重新初始化。
同时,执行 upgrade 命令后,会根据代码中定义的模型类创建对应的表,表的字段与模型类中定义的一致。
如上面的数据库中创建了user表,因为在我的models里面定义了该表:
from exts import db
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
email = db.Column(db.String(20), nullable=False)
username = db.Column(db.String(50), nullable=False)
pw_hash = db.Column(db.String(128), nullable=False)
def __init__(self, email, username, password):
self.email = email
self.username = username
self.set_password(password)
def set_password(self, password):
self.pw_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.pw_hash, password)而如果数据库中有其他表(没有对应模型类的表),会被删除。这点需要特别注意,数据库迁移时最好使用一个新的数据库(不要与其他项目用同一个数据库),避免造成数据丢失。
优势:
个人直观感受使用数据库迁移的优势有:
使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表。就是将关系型数据库的一张张表转化成了Python的一个个类。
这里即我们之前在 models.py 文件中创建的类,可以通过数据库迁移直接生成表
在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库,最简单粗暴的方式就是删除旧表,然后在增加新表,这样做的缺点是会造成数据丢失。在 Flask 中,可以使用数据库迁移来解决这个问题,数据库迁移可以追踪数据模型类的变化,然后把变动应用到数据库中,不会删表造成数据丢失。
大部分参考COPY自:
https://www.cnblogs.com/jiangchunsheng/p/9218338.html
https://blog.csdn.net/weixin_43790276/article/details/103554632
https://www.jianshu.com/p/70cc32d9d2ff
Flask flask-migrate 数据库迁移的更多相关文章
- Flask项目中数据库迁移的使用
数据库迁移 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用 ...
- Flask之flask-migrate 数据库迁移
简介 flask-migrate是flask的一个扩展模块,主要是扩展数据库表结构的. 官方文档:http://flask-migrate.readthedocs.io/en/latest/ 使用fl ...
- migrate数据库迁移
可先参看博友的博文:https://segmentfault.com/a/1190000005599416 由于Yii migrate 生成的迁移文件默认是存放在 console/migrations ...
- Laravel5.x的php artisan migrate数据库迁移创建操作报错SQLSTATE[42000]解决
Laravel5.x运行迁移命令创建数据表:php artisan migrate报错. Illuminate\Database\QueryException : SQLSTATE[42000]: ...
- yii2 migrate 数据库迁移的简单分享
开发中经常会用到的方法小结: 1../yii migrate xxx_xx 在表中插入某字段 : public function up() {$this->addColumn('{{applic ...
- Flask_Migrate数据库迁移
migrate数据库迁移 有models,没有迁移仓库.本地新建数据库:首次创建迁移仓库.迁移脚本:执行迁移脚本生成数据库表: python manage.py db init python mana ...
- 细说flask数据库迁移
什么情况下要用数据库迁移? 在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化 ...
- flask数据库迁移理解及命令
前言: 使用数据库迁移,可以直接建表,而不用我们自己写sql语句用来建表.就是将关系型数据库的一张张表转化成了Python的一个个类. 在开发中经常会遇到需要修改原来的数据库模型,修改之后更新数据库, ...
- Flask从入门到精通之使用Flask-Migrate实现数据库迁移
在开发程序的过程中,你会发现有时需要修改数据库模型,而且修改之后还需要更新数据库.仅当数据库表不存在时,Flask-SQLAlchemy 才会根据模型进行创建.因此,更新表的唯一方式就是先删除旧表,不 ...
- Flask 数据库迁移
在开发过程中,需要修改数据库模型,而且还要在修改之后更新数据库.最直接的方式就是删除旧表,但这样会丢失数据. 更好的解决办法是使用数据库迁移框架,它可以追踪数据库模式的变化,然后把变动应用到数据库中. ...
随机推荐
- Spider_基础总结6--动态网页抓取--selenium
# 有些网站使用 '检查元素'也不能够好使,它们会对地址进行加密,此时使用Selenium 调用浏览器渲染引擎可以模拟用户的操作,完成抓取: # 注:selenium既可以抓取静态网页也可以抓取动态网 ...
- nginx&http 第三章 ngx 1-http ngx_http_wait_request_handler
对于活跃的 HTTP 连接,在执行连接建立回调函数 ngx_http_init_connection 的过程中会执行 ngx_http_wait_request_handler 回调函数, 负责 HT ...
- tcpack----- 2sack dack
道当我们接收到ack的时候,我们会判断sack段,如果包含sack段的话,我们就要进行处理.这篇blog就主要来介绍内核如何处理sack段 sack dsack概念 TCP在一个RTO超时后会重传数据 ...
- one-wallhaven 一个壁纸程序
one-wallhaven 一款基于 Electron 壁纸客户端 . gitee:https://gitee.com/ml13/wallhaven-electron github:https://g ...
- Ceph中的Copyset概念和使用方法
前言 copyset运用好能带来什么好处 降低故障情况下的数据丢失概率(增加可用性) 降低资源占用,从而降低负载 copyset的概念 首先我们要理解copyset的概念,用通俗的话说就是,包含一个数 ...
- Java从后端下载文件到浏览器
// 注: // 获取项目下文件或者文件流 // File file = new File(this.getClass().getResource("/xls/adminImportUser ...
- 学习搭建 Consul 服务发现与服务网格-有丰富的示例和图片
目录 第一部分:Consul 基础 1,Consul 介绍 2,安装 Consul Ubuntu/Debian 系统 Centos/RHEL 系统 检查安装 3,运行 Consul Agent 启动 ...
- 08 . Vue脚手架安装,使用,自定义配置和Element-UI导入使用
Vue脚手架 Vue脚手架可以快速生成Vue项目基础的架构. 安装3.x版本的Vue脚手架 /* npm install -g @vue/cli@3.3 */ 基于3.3版本的脚手架命令创建Vue项目 ...
- Spring源码理论
Spring Bean的创建过程: Spring容器获取Bean和创建Bean都会调用getBean()方法. getBean()方法 1)getBean()方法内部最终调用doGetBean()方法 ...
- 从 Webpack 到 Snowpack, 编译速度提升十倍以上——TRPG Engine迁移小记
动机 TRPG Engine经过长久以来的迭代,项目已经显得非常臃肿了.数分钟的全量编译, 每次按下保存都会触发一次10s到1m不等的增量编译让我苦不堪言, 庞大的依赖使其每一次编译都会涉及很多文件和 ...