flnxi-Wu/scripts/migrate-material-fields.js
WuYongJie d1c6efc79d
Some checks failed
CI Check / check (push) Has been cancelled
feat: NAS 部署与 Harbor 推送流程
2025-12-03 14:39:06 +08:00

98 lines
3.6 KiB
JavaScript

// 数据库迁移脚本 - 添加素材表的可选字段
const { PrismaClient } = require('@prisma/client')
const prisma = new PrismaClient()
async function migrate() {
try {
console.log('开始执行数据库迁移...\n')
// 执行 SQL 迁移 - 需要分开执行每个命令
console.log('执行 SQL 迁移...')
const commands = [
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "brandName" TEXT`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "seriesName" TEXT`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "skuCode" TEXT`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "materialTexture" TEXT`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "renderTime" TEXT`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "imageResolution" TEXT`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "colorMode" TEXT`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "displayImages" TEXT NOT NULL DEFAULT ''`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "platformName" TEXT NOT NULL DEFAULT ''`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "previewUrls" TEXT`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "metadata" TEXT`,
`ALTER TABLE "materials" ADD COLUMN IF NOT EXISTS "templateId" TEXT`,
`CREATE INDEX IF NOT EXISTS "materials_platformName_idx" ON "materials"("platformName")`,
]
// 执行每个 ALTER TABLE 和 CREATE INDEX 命令
for (const cmd of commands) {
try {
await prisma.$executeRawUnsafe(cmd)
console.log(` ✓ ${cmd.substring(0, 60)}...`)
} catch (error) {
// 如果列已存在,忽略错误
if (error instanceof Error && error.message.includes('already exists')) {
console.log(` - 已存在: ${cmd.substring(0, 60)}...`)
} else {
throw error
}
}
}
// 执行外键约束(使用 $queryRawUnsafe 因为包含 DO 块)
const fkCommand = `
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conname = 'materials_templateId_fkey'
) THEN
ALTER TABLE "materials" ADD CONSTRAINT "materials_templateId_fkey" FOREIGN KEY ("templateId") REFERENCES "upload_templates"("id") ON DELETE SET NULL ON UPDATE CASCADE;
END IF;
END $$;
`
try {
await prisma.$queryRawUnsafe(fkCommand)
console.log(` ✓ 外键约束已添加或已存在`)
} catch (error) {
// 忽略外键已存在的错误
if (error instanceof Error && error.message.includes('already exists')) {
console.log(` - 外键约束已存在`)
} else {
throw error
}
}
console.log('\n✅ 迁移成功!')
console.log('已添加以下字段到 materials 表:')
console.log(' - brandName')
console.log(' - seriesName')
console.log(' - skuCode')
console.log(' - materialTexture')
console.log(' - renderTime')
console.log(' - imageResolution')
console.log(' - colorMode')
console.log(' - displayImages')
console.log(' - platformName')
console.log(' - previewUrls')
console.log(' - metadata')
console.log(' - templateId')
console.log(' - 索引: materials_platformName_idx')
console.log(' - 外键: materials_templateId_fkey')
} catch (error) {
console.error('❌ 迁移失败:', error)
if (error instanceof Error) {
console.error('错误信息:', error.message)
console.error('错误堆栈:', error.stack)
}
process.exit(1)
} finally {
await prisma.$disconnect()
}
}
migrate()