文章目录
介绍flask-migrate:
flask-migrate,一个用来做数据迁移的falsk扩展,一般都是结合flask-sqlalchemy使用
一般我们修改数据库通常不会直接手动修改,这样效率不仅慢,而且也需要对整体结构清晰,正常情况是修改ORM对应的模型,然后再把模型映射到数据库中。
它是基于Alembic进行的一个封装,并集成到Flask中,而所有的迁移操作其实都是Alembic做的,他能跟踪模型的变化,并将变化映射到数据库中。
1、Migrate在app.py文件的使用:
# app.py
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 创建数据库sqlalchemy工具对象
db = SQLAlchemy(app)
# db被放到另外一个文件中时,可以使用这个方式连接绑定数据库
# db.init_app(app)
# 创建数据库迁移工具对象
migrate = Migrate(app=app,db=db)
#让python支持命令行工作
manager = Manager(app)
# 向manager对象中添加数据库操作命令
manger.add_command('db', MigrateCommand)
if __name__ == '__main__':
manger.run()
# 终端运行 python app.py runserver
# 或 python app.py runserver -h 0.0.0.0 -p 端口
写到这里时还缺少两个前提:
1、对于数据库的连接,不连接肯定是无法操作数据库的
2、我们对数据库中的表进行增删改的操作(比如建表、增减字段等)
因为一般我们使用Migrate时,肯定是对表结构进行了的修改才会用到
2、创建数据库模型类(即MTV中的Model)
# model.py
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy() # 这句话其实可以放到公共文件中存放调用,比如ext文件下的__init__.py文件
# 建表
class User(db.Model): # 必须继承Model
__tablename__ = 'user'
# 表名,不写是默认也是user,
# 表名规则是除了第1个字母,其余大写字母前面都会加上“_”
# 例如UserName,最终生成的表名是:user_name
# db.Cloumn(SQLAlchemy().类型,约束) 映射表中的列
id = db.Column(db.Integer, primary_key=True, autoincrement=True, comment='主键id')
# 这里解释下id,int类型,设置主键,自动递增,备注comment
username = db.Column(db.String(15), nullable=False)
phone = db.Column(db.String(11),unique=True)
email = db.Column(db.String(20))
create_at = db.Column(db.DateTime, default=datetime.now)
def __str__(self):
return self.username
其实数据库类型还有很多,可查看sqlalchemy官方文档:
https://docs.sqlalchemy.org/en/13/core/type_basics.html#generic-types
3、对数据库的连接
配置数据库的连接路径格式,(以MySQL为例):
mysql+pymysql://user:password@IP地址:port/数据库
# setting.py
def Config:
# mysql+pymysql://user:password@IP地址:port/数据库
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/db'
# 如果设置成 True (默认情况),Flask-SQLAlchemy 将会追踪对象的修改并且发送信号。这需要额外的内存, 如果不必要的可以禁用它。
SQLALCHEMY_TRACK_MODIFICATIONS = False
4、最终的app.py文件
# app.py
from flask import Flask
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand
from flask_sqlalchemy import SQLAlchemy
from model import User # 导入模型中的User表
# (重点,不导入模型表虽然不会报错,但是执行命令后,数据库不会建表)
from setting import Config # 导入数据库连接配置
app = Flask(__name__)
# 导入配置信息
app.config.from_object(Config )
# 创建数据库sqlalchemy工具对象
db = SQLAlchemy()
# 创建数据库迁移工具对象
migrate = Migrate(app=app,db=db)
#让python支持命令行工作
manager = Manager(app)
# 向manager对象中添加数据库操作命令
manger.add_command('db', MigrateCommand)
'''
MigrateCommand是flask-migrate集成的一个命令。
因此想要添加到脚本命令中,需要采用managre.add_command('db', MigrateCommand)的方式.
以后运行python app.py db xxx的命令,其实就是执行MigrateCommand。
'''
if __name__ == '__main__':
manger.run()
5、使用命令操作数据库(数据库迁移同步:)
在命令行中或终端执行命令
第1步:init 初始化一个迁移文件夹
产生一个 migrations文件夹,这个文件作用:主要记录版本号 。
一个项目只需要init一次
>>> python app.py db init
# 数据库下会生成一个表(alembic_version,主要记录的是版本文件
# 降级也是降为上一个版本:downgrade)
第2步:迁移
自动产生一个版本文件(里面是对数据库的操作:upgrade;
比如增加了什么字段、建的什么表,删除了什么类型等)
>>> python app.py db migrate
第3步:同步
生成数据库的表,将版本号的内容同步到数据表中(alembic_version)
最后这个才是将映射文件真正映射到数据库中:
>>> python app.py db upgrade
降级还原时使用下面的,否则不用
>>>python app.py db downgrade {{版本号}} # 版本号选填
总结:
只要对模型(数据表)进行了修改(比如:修改、删除了字段等),就需要不断进行“迁移”、“同步”操作
前提:py文件的版本号-必须与-数据库表(alembic_version)中的版本号一致