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, Pressconfig = 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, relationshipclass 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
: 当前秒(两位数)