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

posted on 2020-12-27 22:02  snail_z  阅读(328)  评论(0)    收藏  举报

导航