Alembic基于python实现,用于对数据库生成迁移脚本,实现自动化升级数据库(如加入新字段,修改字段等)或降级数据库(回退到之前的版本)。通常与sqlalchemy库一起使用。具体信息见官方文档
安装alembic
pip install alembic
在项目文件下进行初始化
alembic init alembic
初始化后项目文件夹下会新增alembic
文件夹和alembic.ini
的文件
修改alembic.ini配置文件
配置数据库迁移路径,即将模型数据创建在此DB中
sqlalchemy.url = mysql+pymysql://root:root@localhost/db_1
修改alembic/env.py
文件
非常重要:include_object函数的作用是防止该DB中的其他表加入到迁移脚本(通常是删除操作),简单讲就是迁移脚本只作用于当前模型文件的表,当然如果sqlalchemy.url指向的DB是空表,可忽略此函数
可根据模型文件或已存在的数据库生成迁移脚本
# 1. 根据模型文件的情况
import sys
# # 根据自己模型文件的路径加载
sys.path.insert(0, "..")
from simple_test import models
metadata = models.Base.metadata
# 2. 根据已存在的数据库生成迁移脚本的情况
from sqlalchemy.schema import MetaData
from sqlalchemy import create_engine
# # 注意此数据库连接不可与alembic.ini中的一样,否则迁移脚本无操作
engine = create_engine('mysql+pymysql://root:root@localhost/db_0')
metadata = MetaData(engine)
# # only参数可传入指定的数据库表名列表,表示只对这些表生成迁移脚本,否则就对DB中的全表生成
metadata.reflect(only=["users"])
# # 以上两种方式根据需要选择其中一种即可
target_metadata = metadata
def include_object(object, name, type_, reflected, compare_to):
"""
:param object: 一个SchemaItem对象,
如Table, Column, Index, UniqueConstraint, ForeignKeyConstraint等
:param name: 该对象的名称
:param type_: 该对象的类型,
表对象="table",字段对象="column",索引对象="index",
唯一约束="unique_constraint",
外键约束="foreign_key_constraint"
:param reflected:
True=基于表反射产生(即从数据库中加载的表)
False=该对象来自本地模型数据,即models.Base.metadata
:param compare_to: 与之比较的对象,没有则是None
:return: bool
"""
return not reflected # 表示对从数据库中加载的表不加入到迁移脚本中
# run_migrations_offline函数(测试环境)和run_migrations_online函数(线上环境)修改
with connectable.connect() as connection:
context.configure(
connection=connection, target_metadata=target_metadata,
# 加入以下此行
include_object=include_object,
)
使用模型文件时的models.py文件:
from sqlalchemy import Boolean, Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from .database import Base
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
email = Column(String(100), unique=True, index=True)
hashed_password = Column(String(200))
is_active = Column(Boolean, default=True)
name = Column(String(50), unique=True)
生成迁移脚本文件
alembic revision --autogenerate -m "first commit"
可以看到alembic/versions/文件夹下生成了一个py文件,里面有两个函数用于升级数据库和降级数据库,可根据需要修改。
更新到最新的版本
alembic upgrade head
以后添加字段,直接在模型文件中添加,然后重复第5步和第6步即可。