SQLAlchemy迁移数据库
目录
- SQLAlchemy迁移数据库
- 安装Alembic
- 配置Alembic
- 编辑 alembic.ini
- 编辑env.py
- 生成迁移文件
- 建表语句示例
- 修改迁移文件命名格式
安装Alembic
pip install alembic
配置Alembic
执行初始化后会创建一个 alembic
目录,包含Alembic的配置文件 alembic.ini
和 env.py
alembic init alembic
编辑 alembic.ini
# alembic.ini
sqlalchemy.url = mysql+pymysql://root:666@localhost/fastapidemo
- 驱动:
mysql+pymysql
- 用户名:
root
- 密码:
666
- 主机:
localhost
- 表名:
fastapidemo
编辑env.py
# env.py
from logging.config import fileConfig
from sqlalchemy import engine_from_config
from sqlalchemy import pool
from alembic import context
# 导入你的 Base 和模型
from module import Base, Book, Author, Press
config = context.config
# 默认None 替换成你的Base
target_metadata = Base.metadata
# 其他配置...
生成迁移文件
- 生成迁移文件
alembic revision --autogenerate
- 更新到数据库
alembic upgrade head
建表语句示例
# module.py
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey, Table
from sqlalchemy.orm import DeclarativeBase, relationship
class Base(DeclarativeBase):
__abstract__ = True # 标记为抽象基类,防止直接创建表
book_press = Table('book_press', Base.metadata, Column('book_id', Integer, primary_key=True),
Column('press_id', Integer, primary_key=True))
class Book(Base):
__tablename__ = 'book'
id = Column(Integer, primary_key=True, autoincrement=True)
title = Column(String(15), nullable=False, unique=True)
author_id = Column(Integer, ForeignKey('author.id'))
author = relationship('Author', backref='books', cascade='all,delete')
press = relationship('Press', backref='books', secondary=book_press)
class Author(Base):
__tablename__ = 'author'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(15), nullable=False, unique=True)
class Press(Base):
__tablename__ = 'press'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(15), nullable=False, unique=True)
修改迁移文件命名格式
找到或添加alembic.ini
中的 file_template
配置项
# alembic.ini
file_template = %%(year)d_%%(month).2d_%%(day).2d_%%(hour).2d%%(minute).2d
-
%(rev)s
: 修订版本号 -
%(slug)s
: 修订描述 -
%(year)d
: 当前年份 -
%(month).2d
: 当前月份(两位数) -
%(day).2d
: 当前日期(两位数) -
%(hour).2d
: 当前小时(两位数) -
%(minute).2d
: 当前分钟(两位数) -
%(second).2d
: 当前秒(两位数)