简介
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步即可。