alembic_SQLAlchemy的迁移工具

简介

alembic是SQLAlchemy作者编写的控制 model 版本的模块,配合SQLAlchemy使用更佳, alembic的用法有点类似于git, 可以理解为ORM与数据库的版本管理工具

安装

在项目的虚拟环境中安装

pip install alembic

初始化

# 进入项目目录
cd yourproject
# 执行初始化命令
alembic init alembic

初始化后, 会在项目目录中新增一个alembic文件夹和alembic.ini文件

image-20210505182705004

修改 alembic.ini

alembic.ini文件是alembic的配置文件, 具体每个配置项的含义可以查看官方文档: 教程— Alembic 1.6.0文档 (sqlalchemy.org)

这里我们只需要修改sqlalchemy.url这一项即可, 把SQLAlchemy中创建engine的数据库连接复制进来即可:

sqlalchemy.url = mysql+pymysql://root:password@47.102.114.xx/cy_account

注: 这里的驱动不能使用aiomysql, 若使用了则会报错

创建模型类

models文件夹下创建文件base_model.py

from sqlalchemy.orm import declarative_base
from sqlalchemy import Column, Integer, String

Base = declarative_base()
class User(Base):
    __tablename__ = 'user'
    user_id = Column(Integer, primary_key=True)
    user_name = Column(String(20))

修改alembic的env.py

修改target_metadata这一项, 把原来的None改为上面模型类使用Base.metadata

# 官方注释
# add your model's MetaData object here
# for 'autogenerate' support
# from myapp import mymodel
# target_metadata = mymodel.Base.metadata
# 默认配置
# target_metadata = None
# 修改后配置
from models import base_model
target_metadata = base_model.Base.metadata

修改这一项的作用是把模型类和alembic关联起来, 这样alembic就可以检测到模型类的修改, 并自动生成对应的修改sql语句

进行迁移(后续修改模型类后也都需要迁移)

生成迁移文件

alembic revision --autogenerate -m 'init'

可以在下方的打印结果中, 看到检测到了新增表user

# 打印结果
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added table 'user'
  Generating /mnt/d/study/python/projects/cy_account/alembic/versions/22456fa02b62_init.py ...  done

同时在alembic目录下的versions中新增了一个文件22456fa02b62_init.py, 这就是生成的迁移文件, 可以理解为对应的建表sql

也可以把这条命令理解为git的commit命令, 只是在本地生成了一个版本, 那么还需要push到远程才能完成提交

提交至数据库

alembic upgrade head
# 打印结果
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.runtime.migration] Running upgrade  -> 22456fa02b62, init

运行完成后, 再去数据库查看可以看到新添加了两张表, 一张alembic_version是alembic用来做版本控制的, 另一张则是我们的模型了类对应的表user

多个模型类文件时

修改模型类文件

上面我们只创建了一个模型类文件base_model, 在里面定义了user表, 如果我们项目比较大, 有多个模块, 想把每个模块的模型类都定义在不同的py文件中, 如这里有用户模块和订单模块, 分别对应用户模型类users.pyorders.py

# users.py, 把上面base_model中定义User移动到这里定义
from sqlalchemy import Column, Integer, String
from models.base_model import Base
class User(Base):
    __tablename__ = 'user'
    user_id = Column(Integer, primary_key=True)
    user_name = Column(String(20))
# orders.py
from sqlalchemy import Column, Integer, String
from models.base_model import Base

class Order(Base):
    __tablename__ = 'order'
    order_id = Column(Integer, primary_key=True)
    order_num = Column(String(20))

同时还需要在base_model.py中导入上面定义的两个模型类文件才行, 否则alembic检测不到模型类

# base_model.py
from sqlalchemy.orm import declarative_base
Base = declarative_base()
# 注意先创建Base, 再导入模型类文件
from models import users
from models import orders

进行迁移

# 生成迁移文件
alembic revision --autogenerate -m 'xxxx'
# 提交至数据库
alembic upgrade head
原文地址:https://www.cnblogs.com/gcxblogs/p/14979282.html