SQLAlchemy迁移数据库

SQLAlchemy迁移数据库

目录

  • SQLAlchemy迁移数据库
    • 安装Alembic
    • 配置Alembic
    • 编辑 alembic.ini
    • 编辑env.py
    • 生成迁移文件
    • 建表语句示例
    • 修改迁移文件命名格式

安装Alembic

pip install alembic

配置Alembic

执行初始化后会创建一个 alembic 目录,包含Alembic的配置文件 alembic.inienv.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: 当前秒(两位数)
上一篇:使用React复刻ThreeJS官网示例——keyframes动画


下一篇:【NTN 卫星通信】Starlink基于终端用户的测量以及测试概述