FastAPI与Alembic:数据库迁移的隐秘艺术
title: FastAPI与Alembic:数据库迁移的隐秘艺术


pip install fastapi sqlalchemy alembic pymysql
project/
├── alembic.ini
├── alembic/
│ ├── env.py
│ ├── script.py.mako
│ └── versions/
├── app/
│ ├── models.py
│ └── main.py
from app.models import Base # 导入项目中的模型基类
target_metadata = Base.metadata # 关键配置项
def run_migrations_online():
engine = create_engine(config.get_main_option("sqlalchemy.url"))
with engine.connect() as connection:
context.configure(connection=connection, target_metadata=target_metadata)
with context.begin_transaction():
context.run_migrations()
alembic revision --autogenerate -m "add user table"
def upgrade():
# 升级操作
op.add_column('user', sa.Column('email', String(120)))
def downgrade():
# 回滚操作
op.drop_column('user', 'email')
# app/models.py
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
username = Column(String(50), unique=True)
password_hash = Column(String(128))
def __repr__(self):
return f"<User {self.username}>"
alembic revision --autogenerate -m "init"
alembic upgrade head
class User(Base):
# 原有字段...
email = Column(String(120), nullable=False, comment='用户邮箱') # 新增字段
alembic revision --autogenerate -m "add email column"
alembic upgrade head
with op.batch_alter_table('child_table') as batch_op:
batch_op.create_foreign_key('fk_parent', 'parent_table', ['parent_id'], ['id'])
def upgrade():
op.alter_column('user', 'age',
existing_type=sa.INTEGER(),
type_=sa.String(10),
existing_nullable=True)
评论
发表评论