Alembic
目录
Alembic入门
Alembic是一个处理数据库更改的工具。
当它们使用元数据的create_all方法时,SQLAlchemy只会创建缺失的表,所以它不会更新数据库表以反映我们对列所做的更改。
Alembic提供一种 添加/删除表,更改列名和添加新约束的方法。
安装:
pip install alembic
1 创建迁移环境
alembic init migrations(目录命令)
migrations
readme
env.py
script.py.mako
versions
alembic.ini
2 配置迁移环境
1、修改:alembic.ini 文件
sqlalchemy.url = sqlite:///alembictest.db
2、在app/db.py
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
# engine = create_engine('sqlite:///alembictest.db')
engine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/core?charset=utf8')
Base = declarative_base()
3、更改env.py
# 将当前工作目录添加到sys.path中,python会在sys.path中搜索模块
import os
import sys
sys.path.append(os.getcwd())
#
from app.db import Base
target_metadata = Base.metadata
创建迁移
1 创建基础空迁移
# 在 alembic.ini 同一级下执行
alembic revision -m "empty init"
2 自动创建迁移
# 在 app/db.py 中创建 类
alembic revision --autogenerate -m "add alem model"
# 此时如果失败,将版本号手动添加到“自动生成的表alembic_version字段version_num中”即可
# 生成表
alembic upgrade head
自动生成模式可以检测的模式变化
| 模式元素 | 更改 |
|---|---|
| 表 | 添加和删除 |
| 列 | 添加、删除、列的“允许空值”状态的变化 |
| 索引 | 索引的基本变化、显示命名的唯一性约束、支持自动生成索引和唯一性约束 |
| 键 | 基本的重命名 |
| 自动生成功能无法检测的模式变化 | |
| 模式元素 | 更改 |
| :----: | :---- |
| 表 | 名称变化 |
| 列 | 名称变化 |
| 约束 | 无明确名称的约束 |
| 类型 | ENUM这类数据库后端不直接支持的类型 |
3 手动创建迁移
# 重命名表名
## 1 修改db.py表名
## 2 生成迁移文件
alembic revision -m "rename alem to new_alem"
## 3 修改迁移文件
def upgrade():
op.rename_table('alem', 'new_alem')
def downgrade():
op.rename_table('new_alem', 'alem')
## 4 升级
alembic upgrade head
# 注:升级失败,由于alembic_num版本记录仍是 init 时的版本,升级会发现表已经存在(第一步创建表)。将version_num修改到创建表时的版本即可
# 不知道为什么 version_num不自动变化
alembic操作
| 操作 | 用途 |
|---|---|
| add_column | 添加新列 |
| alter_column | 更改列类型、服务器默认值或名称 |
| create_check_constraint | 添加新的约束 |
| create_foreign_key | 添加新的外键 |
| create_index | 添加新的索引 |
| create_primary_key | 添加新主键 |
| create_table | 添加新表 |
| create_unique_constraint | 添加新的唯一约束 |
| drop_column | 删除列 |
| drop_constraint | 删除约束 |
| drop_index | 删除索引 |
| drop_table | 删除表 |
| execute | 运行原始SQL |
| rename_table | 重命名表 |
控制alembic
1 确定数据库的迁移级别
# alembic current
head 表示最后一次迁移
# 迁移历史
(base) snail@snail:/mnt/d/3-job/python/essential-sqlalchemy-2e-master/test$ alembic history
06e357879b3d -> 283b20e4787c (head), rename alem to new_alem
1b5059766907 -> 06e357879b3d, rename alem to new_alem
d8588f4f6f84 -> 1b5059766907, add alem model
<base> -> d8588f4f6f84, empty init
2 迁移降级
# alembic downgrade xxxx
3 标记数据库的迁移级别
# 执行如跳过迁移或恢复数据库操作
alembic stamp xxx
# 升级数据库的version_num,只是更新alembic_version表,数据库不修改,实际上跳过这个迁移
4 生成SQL
#
alembic upgrade 34044511331:2e6a6cc63e9 --sql
浙公网安备 33010602011771号