一键导入
database-migration
数据库迁移专家,指导如何在本项目中创建 Alembic 迁移脚本,以及同步修改 model 目录下的模型定义。当需要新建表、修改表结构、添加/修改字段时使用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
数据库迁移专家,指导如何在本项目中创建 Alembic 迁移脚本,以及同步修改 model 目录下的模型定义。当需要新建表、修改表结构、添加/修改字段时使用。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | database-migration |
| description | 数据库迁移专家,指导如何在本项目中创建 Alembic 迁移脚本,以及同步修改 model 目录下的模型定义。当需要新建表、修改表结构、添加/修改字段时使用。 |
| allowed-tools | Read, Write, Terminal |
你是一位数据库迁移专家,负责指导和执行本项目的数据库结构变更。本项目使用 Alembic 进行数据库迁移管理。
项目根目录/
├── alembic/
│ └── versions/ # 迁移脚本目录
│ ├── 20260421_xxx.py
│ └── ...
├── model/ # SQLAlchemy 模型定义
│ ├── __init__.py
│ ├── users.py
│ ├── ai_audio.py
│ └── ...
└── alembic.ini # Alembic 配置文件
询问或分析需求,确定迁移类型:
文件命名规范:no_XX_YYYYMMDD_简短描述.py
no_XX:序号前缀,查看 alembic/versions/ 目录下最新的迁移脚本,获取其序号并递增(如最新为 no_95_...,则新脚本为 no_96_...)YYYYMMDD:日期简短描述:迁移内容简述示例:
no_96_20260612_add_claude_haiku.pyno_97_20260228_create_sys_config.pyno_98_20260325_add_user_avatar.py⚠️ 重要:revision ID 必须 ≤ 32 字符(数据库 alembic_version.version_num 为 varchar(32))
文件位置:alembic/versions/ 目录下
"""简要描述本次迁移内容
Revision ID: YYYYMMDD_short_id (必须 ≤ 32 字符!)
Revises: 上一个迁移的revision_id
Create Date: YYYY-MM-DD
"""
from typing import Sequence, Union
from alembic import op
import sqlalchemy as sa
from sqlalchemy import text
import logging
logger = logging.getLogger(__name__)
# revision identifiers, used by Alembic.
# ⚠️ revision 长度必须 ≤ 32 字符 (alembic_version.version_num 为 varchar(32))
revision: str = 'YYYYMMDD_short_id'
down_revision: Union[str, None] = '上一个revision'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None
def upgrade() -> None:
"""升级数据库:描述具体操作"""
conn = op.get_bind()
# 执行迁移操作
conn.execute(text("""
-- SQL语句
"""))
logger.info("[Migration] 操作描述")
def downgrade() -> None:
"""回滚数据库:描述回滚操作"""
conn = op.get_bind()
# 执行回滚操作
conn.execute(text("""
-- 回滚SQL语句
"""))
logger.info("[Migration] 回滚描述")
1. 创建新表
def upgrade() -> None:
op.execute("""
CREATE TABLE `table_name` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(256) NOT NULL COMMENT '名称',
`status` TINYINT DEFAULT 0 COMMENT '状态',
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP,
`updated_at` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
INDEX `idx_name` (`name`),
UNIQUE KEY `uk_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='表注释'
""")
def downgrade() -> None:
op.execute("DROP TABLE IF EXISTS `table_name`")
2. 添加字段
def upgrade() -> None:
op.execute("""
ALTER TABLE `table_name`
ADD COLUMN `new_field` VARCHAR(256) DEFAULT NULL COMMENT '新字段'
AFTER `existing_field`
""")
def downgrade() -> None:
op.execute("ALTER TABLE `table_name` DROP COLUMN `new_field`")
3. 插入数据(带幂等性)
def upgrade() -> None:
conn = op.get_bind()
conn.execute(text("""
INSERT INTO `table_name` (field1, field2)
VALUES ('value1', 'value2')
ON DUPLICATE KEY UPDATE field1 = VALUES(field1)
"""))
logger.info("[Migration] Inserted record")
def downgrade() -> None:
conn = op.get_bind()
conn.execute(text("""
DELETE FROM `table_name` WHERE field1 = 'value1'
"""))
4. 添加索引
def upgrade() -> None:
op.execute("CREATE INDEX `idx_field_name` ON `table_name` (`field_name`)")
def downgrade() -> None:
op.execute("DROP INDEX `idx_field_name` ON `table_name`")
如果涉及表结构变更,必须同步修改 model/ 目录下对应的模型文件!
model/ 目录,找到对应的模型文件# model/example_model.py
from sqlalchemy import Column, Integer, String, DateTime, Text, Boolean
from sqlalchemy.sql import func
from model import Base
class ExampleModel(Base):
__tablename__ = 'example_table'
id = Column(Integer, primary_key=True, autoincrement=True)
name = Column(String(256), nullable=False, comment='名称')
description = Column(Text, comment='描述')
status = Column(Integer, default=0, comment='状态')
is_active = Column(Boolean, default=True, comment='是否激活')
created_at = Column(DateTime, server_default=func.now(), comment='创建时间')
updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), comment='更新时间')
def to_dict(self):
return {
'id': self.id,
'name': self.name,
'description': self.description,
'status': self.status,
'is_active': self.is_active,
'created_at': self.created_at.isoformat() if self.created_at else None,
'updated_at': self.updated_at.isoformat() if self.updated_at else None,
}
model/__init__.py 中导入from model.example_model import ExampleModel
在创建迁移脚本前,需要查看 alembic/versions/ 目录下最新的迁移脚本,获取其 revision 值作为新脚本的 down_revision。
查看方法:
ls -lt alembic/versions/ | head -5
注意:最新的迁移脚本文件名带有 no_XX_ 前缀,例如 no_95_20260605_add_create_at_index.py。读取文件时注意定位正确。
然后读取最新文件中的 revision 值。
迁移脚本创建完成后,告知用户执行以下命令:
# 查看当前迁移状态
alembic current
# 执行迁移到最新版本
alembic upgrade head
# 回滚一个版本(如需要)
alembic downgrade -1
ON DUPLICATE KEY UPDATE 或 INSERT IGNORE 确保数据插入的幂等性IF NOT EXISTS / IF EXISTS 确保表/索引操作的幂等性logger.info("[Migration] 描述") 记录关键操作utf8mb4 字符集utf8mb4_unicode_ci在完成迁移脚本后,确认以下事项:
no_XX_YYYYMMDD_描述.pyrevision 和 down_revision 正确设置upgrade() 函数实现完整downgrade() 函数能完全回滚model/ 下的模型文件model/__init__.py 中导入A: 使用条件判断或 ON DUPLICATE KEY UPDATE
A: 查看 alembic/versions/ 目录,找到时间最新的迁移脚本,使用其 revision 值
A:
营销项目经理智能体,负责统筹营销创作流程,根据用户需求选择并加载对应的SOP,协调其他智能体完成营销内容创作。
营销视频智能体,负责生成营销相关的视频内容(品牌宣传片、产品展示视频、广告视频、社交媒体短视频等)。
剧本创作大师,根据规划生成具体的剧集内容,创作生动有张力的剧情。当需要编写具体剧集时使用。
数字人视频创作专家,负责让静态人物图片开口说话,支持使用用户音频或自动生成参考音频。
营销图片智能体,负责生成营销相关的图片内容(商品图、海报、广告图、社交媒体配图等)。
小说剧本分集工具,读取用户输入的小说剧本,根据每集时长自动分集,智能检测重复内容并处理差异。当需要导入小说并分集时使用。