简介
alembic是SQLAlchemy作者编写的控制 model 版本的模块,配合SQLAlchemy使用更佳, alembic的用法有点类似于git, 可以理解为ORM与数据库的版本管理工具
安装
在项目的虚拟环境中安装
pip install alembic
初始化
# 进入项目目录
cd yourproject
# 执行初始化命令
alembic init alembic
初始化后, 会在项目目录中新增一个alembic文件夹和alembic.ini文件
修改 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.py
和 orders.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