98 lines
3.6 KiB
JavaScript
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()
|
|
|