// 数据库迁移脚本 - 添加素材表的可选字段 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()