创建表时,无论是Core 的 metadata.create_all(engine),还是ORM 的 Base.metadata.create_all(engine),sqlalchemy都只会创建缺失的表,不会更新表的结构,也不会删除表。当我们想给已经存在于数据库的表 添加或删除 列、拆分模型 等操作时,create_all()无法实现。 Alembic可以实现上述功能,是一个 处理数据库更改 的工具。
迁移可以理解为 数据库内容 更新、更改。
安装alembic
(venv) > pip install alembic
创建迁移环境。 在venv同级目录下 创建c11 文件夹,cmd开venv进入c11,alembic init alembic(这个参数自己改想要的名字)
(venv) D:\alchemy\c11>alembic init alembic
生成的文件目录结构
|-alembic #生成的时候自己起的名字
| |-README
| |-env.py #用于 定义和实例化sqlalchemy引擎
| |-script.py.mako #模板文件,用于 创建迁移,定义了version里迁移文件 的基本代码结构
| |-versions #用于保存 所有级别 的迁移脚本
|-alembic.ini #包含配置选项(配置要指向的 数据库)
配置迁移环境 。
首先调整alembic.ini和env.py,让alembic能和 数据库及app一起工作。
修改 alembic.ini 里的 sqlalchemy_url 行。指向需要 进行迁移(更新)的 数据库。
sqlalchemy_url = sqlite:///alembictest.db
在alembic.ini的同级目录 创建app文件夹,app里创建一个空的 __init__.py,让app变成一个模块。
app里创建 db.py,对sqlalchemy进行配置,使其连接的 数据库 和ini里sqlalchemy_url的一样,并定义一个基类。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')
Base = declarative_base()
更改env.py,使其指向metadata(Base.metadata)。env.py会使用metadata将在 数据库中找到的表 与 sqlalchemy中定义的模型 进行比较。
import os
import sys
sys.path.append(os.getcwd())
修改env.py里的 target_metadata 行。让alembic把 Base.metadata作为目标。
from app.db import Base
target_metadata = Base.metadata
至此,alembic环境设置好了,它可以共享 app 的数据库db 和 元数据metadata.