当前位置: 首页 > 工具软件 > alembic > 使用案例 >

Alembic生成数据库迁移脚本

祝高超
2023-12-01

简介

Alembic基于python实现,用于对数据库生成迁移脚本,实现自动化升级数据库(如加入新字段,修改字段等)或降级数据库(回退到之前的版本)。通常与sqlalchemy库一起使用。具体信息见官方文档

使用

  1. 安装alembic
    pip install alembic

  2. 在项目文件下进行初始化

    alembic init alembic
    

    初始化后项目文件夹下会新增alembic文件夹和alembic.ini的文件

  3. 修改alembic.ini配置文件

    配置数据库迁移路径,即将模型数据创建在此DB中

    sqlalchemy.url = mysql+pymysql://root:root@localhost/db_1
    
  4. 修改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)
    
  5. 生成迁移脚本文件

    alembic revision --autogenerate -m "first commit"
    

    可以看到alembic/versions/文件夹下生成了一个py文件,里面有两个函数用于升级数据库和降级数据库,可根据需要修改。

  6. 更新到最新的版本

    alembic upgrade head
    
  7. 以后添加字段,直接在模型文件中添加,然后重复第5步和第6步即可。

 类似资料: