全栈开发

alembic 使用教程

1、安装

pip install alembic
pip install asyncmy
pip install cryptography

2、迁移

2.1 创建迁移仓库

alembic的使用类似git,也可以进行版本回退,并且都需要创建好一个迁移仓库,在项目根目录下使用一下命令生成仓库

alembic init alembic --template async

如果项目MYSQL驱动不是一步的,比如pymysql那么就不需要执行 --template async

2.2 修改alembic.ini

要将模型迁移到数仓中还需要修改alembic.ini下连接数据库的配置,修改代码如下:

sqlalchemy.url = mysql+asyncmy://xxx:xxx@xxx:3306/xxx?charset=utf8mb4

2.3 修改env.py

将alembic/env.py文件中的target_metadata修改为如下:

from models imprt Base

target_metadata = Base.metadata

这里models代码如下

models/__init__.py

from sqlalchemy import create_engine
from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker


SQL_DATABASE_URL = "mysql+asyncmy://datacenter:tYwTwDtjLtBRSKYk@49.232.247.243:3306/datacenter?charset=utf8mb4"


engine = create_async_engine(
    SQL_DATABASE_URL,
    # 将输出所有执行SQL的日志(默认是关闭的)
    echo=True,
    # 连接池大小(默认是5个)
    pool_size=10,
    # 允许连接池最大的连接数(默认是10个)
    max_overflow=20,
    # 获得连接超时时间(默认30秒)
    pool_timeout=10,
    # 连接回收时间(默认是-1, 代表永不回收)
    pool_recycle=3600,
    # 连接前是否预检查(默认为Faslse)
    pool_pre_ping=True
)

AsyncSessionFactory = sessionmaker(
    # Engine或者其子类对象(这里是AsyncEngine)
    bind=engine,
    # Session类的代替(默认是Session类)
    class_=AsyncSession,
    # 是否在查找之前执行flush操作(默认是True)
    autoflush=True,
    # 是否执行commit操作后Session就过期(默认是True)
    expire_on_commit=False
)

Base = declarative_base()

# 导入其他模型的python文件
from . import users, articles, settings

models/users.py 代码如下:

from sqlalchemy import Column, Integer, String, ForeignKey, Table, DateTime, Boolean
from models import Base


class User(Base):
    __tablename__ = "users"
    id = Column(Integer, primary_key=True)
    username = Column(String(50), unique=True, index=True)
    password = Column(String(255))

2.4 生成迁移脚本

如果模型发生改变了,那么需要先将模型生成迁移脚本,执行一下命令:

alembic revision --autogenerate -m "修改的内容注释"

这样就会在alembic/versions下生成迁移脚本。

2.5 执行迁移脚本

在alembic/versions下生成迁移脚本后,模型的修改并没有同步到数据库中,因此还需要执行以下命令:

alembic upgrade head

如果想要回到上岗一次的版本,那么可以使用一下命令来实现:

alembic downgrade