| | import fs from 'fs'; |
| | import path from 'path'; |
| | import { fileURLToPath } from 'url'; |
| |
|
| | |
| | const __filename = fileURLToPath(import.meta.url); |
| | const __dirname = path.dirname(__filename); |
| |
|
| | console.log('🔧 开始修复 PostgreSQL 迁移问题...\n'); |
| |
|
| | |
| | const migrationsDir = path.join(__dirname, 'server', 'prisma', 'migrations'); |
| | const migrationFiles = fs.readdirSync(migrationsDir) |
| | .filter(file => file.endsWith('.sql')); |
| |
|
| | console.log('📂 发现的迁移文件:'); |
| | migrationFiles.forEach(file => console.log(` - ${file}`)); |
| |
|
| | |
| | console.log('\n🗑️ 清理现有迁移文件...'); |
| | migrationFiles.forEach(file => { |
| | const filePath = path.join(migrationsDir, file); |
| | fs.unlinkSync(filePath); |
| | console.log(` 已删除: ${file}`); |
| | }); |
| |
|
| | |
| | console.log('\n📝 创建新的合并迁移文件...'); |
| | const newMigrationFile = path.join(migrationsDir, '20230921191814_initial_migration.sql'); |
| |
|
| | const migrationSQL = `-- Initial Migration for PostgreSQL |
| | -- This migration combines all tables from the previous separate migrations |
| | |
| | -- Create all tables in the correct order to satisfy foreign key constraints |
| | |
| | -- Users table (referenced by many others) |
| | CREATE TABLE "users" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "username" TEXT UNIQUE, |
| | "password" TEXT NOT NULL, |
| | "pfpFilename" TEXT, |
| | "role" TEXT NOT NULL DEFAULT 'default', |
| | "suspended" INTEGER NOT NULL DEFAULT 0, |
| | "seen_recovery_codes" BOOLEAN DEFAULT false, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "dailyMessageLimit" INTEGER, |
| | "bio" TEXT DEFAULT '' |
| | ); |
| | |
| | -- Workspaces table (referenced by many others) |
| | CREATE TABLE "workspaces" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "name" TEXT NOT NULL, |
| | "slug" TEXT NOT NULL UNIQUE, |
| | "vectorTag" TEXT, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "openAiTemp" REAL, |
| | "openAiHistory" INTEGER NOT NULL DEFAULT 20, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "openAiPrompt" TEXT, |
| | "similarityThreshold" REAL DEFAULT 0.25, |
| | "chatProvider" TEXT, |
| | "chatModel" TEXT, |
| | "topN" INTEGER DEFAULT 4, |
| | "chatMode" TEXT DEFAULT 'chat', |
| | "pfpFilename" TEXT, |
| | "agentProvider" TEXT, |
| | "agentModel" TEXT, |
| | "queryRefusalResponse" TEXT, |
| | "vectorSearchMode" TEXT DEFAULT 'default' |
| | ); |
| | |
| | -- System settings table |
| | CREATE TABLE "system_settings" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "label" TEXT NOT NULL UNIQUE, |
| | "value" TEXT, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| | ); |
| | |
| | -- API keys table |
| | CREATE TABLE "api_keys" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "secret" TEXT UNIQUE, |
| | "createdBy" INTEGER REFERENCES "users"("id"), |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| | ); |
| | |
| | -- Invites table |
| | CREATE TABLE "invites" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "code" TEXT NOT NULL UNIQUE, |
| | "status" TEXT NOT NULL DEFAULT 'pending', |
| | "claimedBy" INTEGER REFERENCES "users"("id"), |
| | "workspaceIds" TEXT, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "createdBy" INTEGER NOT NULL REFERENCES "users"("id"), |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| | ); |
| | |
| | -- Document vectors table |
| | CREATE TABLE "document_vectors" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "docId" TEXT NOT NULL, |
| | "vectorId" TEXT NOT NULL, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| | ); |
| | |
| | -- Welcome messages table |
| | CREATE TABLE "welcome_messages" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "user" TEXT NOT NULL, |
| | "response" TEXT NOT NULL, |
| | "orderIndex" INTEGER, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| | ); |
| | |
| | -- Workspace documents table |
| | CREATE TABLE "workspace_documents" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "docId" TEXT NOT NULL UNIQUE, |
| | "filename" TEXT NOT NULL, |
| | "docpath" TEXT NOT NULL, |
| | "workspaceId" INTEGER NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "metadata" TEXT, |
| | "pinned" BOOLEAN DEFAULT false, |
| | "watched" BOOLEAN DEFAULT false, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| | ); |
| | |
| | -- Workspace chats table |
| | CREATE TABLE "workspace_chats" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "workspaceId" INTEGER NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "prompt" TEXT NOT NULL, |
| | "response" TEXT NOT NULL, |
| | "include" BOOLEAN NOT NULL DEFAULT true, |
| | "user_id" INTEGER REFERENCES "users"("id") ON DELETE CASCADE, |
| | "thread_id" INTEGER, |
| | "api_session_id" TEXT, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "feedbackScore" BOOLEAN |
| | ); |
| | |
| | -- Workspace users table (junction table) |
| | CREATE TABLE "workspace_users" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "user_id" INTEGER NOT NULL REFERENCES "users"("id") ON DELETE CASCADE, |
| | "workspace_id" INTEGER NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| | ); |
| | |
| | -- Workspace suggested messages table |
| | CREATE TABLE "workspace_suggested_messages" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "workspaceId" INTEGER NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "heading" TEXT NOT NULL, |
| | "message" TEXT NOT NULL, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| | ); |
| | |
| | -- Event logs table |
| | CREATE TABLE "event_logs" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "event" TEXT NOT NULL, |
| | "metadata" TEXT, |
| | "userId" INTEGER REFERENCES "users"("id"), |
| | "occurredAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| | ); |
| | |
| | -- Cache data table |
| | CREATE TABLE "cache_data" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "name" TEXT NOT NULL, |
| | "data" TEXT NOT NULL, |
| | "belongsTo" TEXT, |
| | "ById" INTEGER, |
| | "expiresAt" TIMESTAMP, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP |
| | ); |
| | |
| | -- Embed configs table |
| | CREATE TABLE "embed_configs" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "uuid" TEXT NOT NULL UNIQUE, |
| | "enabled" BOOLEAN NOT NULL DEFAULT false, |
| | "chat_mode" TEXT NOT NULL DEFAULT 'query', |
| | "allowlist_domains" TEXT, |
| | "allow_model_override" BOOLEAN NOT NULL DEFAULT false, |
| | "allow_temperature_override" BOOLEAN NOT NULL DEFAULT false, |
| | "allow_prompt_override" BOOLEAN NOT NULL DEFAULT false, |
| | "max_chats_per_day" INTEGER, |
| | "max_chats_per_session" INTEGER, |
| | "message_limit" INTEGER DEFAULT 20, |
| | "workspace_id" INTEGER NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "createdBy" INTEGER, |
| | "usersId" INTEGER REFERENCES "users"("id") ON DELETE SET NULL, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "workspace" FOREIGN KEY ("workspace_id") REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "users" FOREIGN KEY ("usersId") REFERENCES "users"("id") ON DELETE SET NULL |
| | ); |
| | |
| | -- Embed chats table |
| | CREATE TABLE "embed_chats" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "prompt" TEXT NOT NULL, |
| | "response" TEXT NOT NULL, |
| | "session_id" TEXT NOT NULL, |
| | "include" BOOLEAN NOT NULL DEFAULT true, |
| | "connection_information" TEXT, |
| | "embed_id" INTEGER NOT NULL REFERENCES "embed_configs"("id") ON DELETE CASCADE, |
| | "usersId" INTEGER REFERENCES "users"("id") ON DELETE SET NULL, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "embed_config" FOREIGN KEY ("embed_id") REFERENCES "embed_configs"("id") ON DELETE CASCADE, |
| | "users" FOREIGN KEY ("usersId") REFERENCES "users"("id") ON DELETE SET NULL |
| | ); |
| | |
| | -- Workspace threads table |
| | CREATE TABLE "workspace_threads" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "name" TEXT NOT NULL, |
| | "slug" TEXT NOT NULL UNIQUE, |
| | "workspace_id" INTEGER NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "user_id" INTEGER REFERENCES "users"("id") ON DELETE CASCADE, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "workspace" FOREIGN KEY ("workspace_id") REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "user" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Workspace agent invocations table |
| | CREATE TABLE "workspace_agent_invocations" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "uuid" TEXT NOT NULL UNIQUE, |
| | "prompt" TEXT NOT NULL, |
| | "closed" BOOLEAN NOT NULL DEFAULT false, |
| | "user_id" INTEGER REFERENCES "users"("id") ON DELETE CASCADE, |
| | "thread_id" INTEGER, |
| | "workspace_id" INTEGER NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "user" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE, |
| | "workspace" FOREIGN KEY ("workspace_id") REFERENCES "workspaces"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Slash command presets table |
| | CREATE TABLE "slash_command_presets" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "command" TEXT NOT NULL, |
| | "prompt" TEXT NOT NULL, |
| | "description" TEXT, |
| | "uid" INTEGER NOT NULL DEFAULT 0, |
| | "userId" INTEGER REFERENCES "users"("id") ON DELETE CASCADE, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "user" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Recovery codes table |
| | CREATE TABLE "recovery_codes" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "user_id" INTEGER NOT NULL REFERENCES "users"("id") ON DELETE CASCADE, |
| | "code_hash" TEXT NOT NULL, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "user" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Password reset tokens table |
| | CREATE TABLE "password_reset_tokens" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "user_id" INTEGER NOT NULL REFERENCES "users"("id") ON DELETE CASCADE, |
| | "token" TEXT NOT NULL UNIQUE, |
| | "expiresAt" TIMESTAMP NOT NULL, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "user" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Browser extension API keys table |
| | CREATE TABLE "browser_extension_api_keys" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "key" TEXT NOT NULL UNIQUE, |
| | "user_id" INTEGER REFERENCES "users"("id") ON DELETE CASCADE, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastUpdatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "user" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Temporary auth tokens table |
| | CREATE TABLE "temporary_auth_tokens" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "token" TEXT NOT NULL UNIQUE, |
| | "userId" INTEGER NOT NULL REFERENCES "users"("id") ON DELETE CASCADE, |
| | "expiresAt" TIMESTAMP NOT NULL, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "user" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- System prompt variables table |
| | CREATE TABLE "system_prompt_variables" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "key" TEXT NOT NULL UNIQUE, |
| | "value" TEXT, |
| | "description" TEXT, |
| | "type" TEXT NOT NULL DEFAULT 'system', |
| | "userId" INTEGER REFERENCES "users"("id") ON DELETE CASCADE, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "updatedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "user" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Prompt history table |
| | CREATE TABLE "prompt_history" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "workspaceId" INTEGER NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "prompt" TEXT NOT NULL, |
| | "modifiedBy" INTEGER REFERENCES "users"("id") ON DELETE SET NULL, |
| | "modifiedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "workspace" FOREIGN KEY ("workspaceId") REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "user" FOREIGN KEY ("modifiedBy") REFERENCES "users"("id") ON DELETE SET NULL |
| | ); |
| | |
| | -- Desktop mobile devices table |
| | CREATE TABLE "desktop_mobile_devices" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "deviceOs" TEXT NOT NULL, |
| | "deviceName" TEXT NOT NULL, |
| | "token" TEXT NOT NULL UNIQUE, |
| | "approved" BOOLEAN NOT NULL DEFAULT false, |
| | "userId" INTEGER REFERENCES "users"("id") ON DELETE CASCADE, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "user" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Document sync queues table |
| | CREATE TABLE "document_sync_queues" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "staleAfterMs" INTEGER NOT NULL DEFAULT 604800000, |
| | "nextSyncAt" TIMESTAMP NOT NULL, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "lastSyncedAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "workspaceDocId" INTEGER NOT NULL UNIQUE REFERENCES "workspace_documents"("id") ON DELETE CASCADE, |
| | "workspaceDoc" FOREIGN KEY ("workspaceDocId") REFERENCES "workspace_documents"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Document sync executions table |
| | CREATE TABLE "document_sync_executions" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "queueId" INTEGER NOT NULL REFERENCES "document_sync_queues"("id") ON DELETE CASCADE, |
| | "status" TEXT NOT NULL DEFAULT 'unknown', |
| | "result" TEXT, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "queue" FOREIGN KEY ("queueId") REFERENCES "document_sync_queues"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Workspace parsed files table |
| | CREATE TABLE "workspace_parsed_files" ( |
| | "id" SERIAL PRIMARY KEY, |
| | "filename" TEXT NOT NULL UNIQUE, |
| | "workspaceId" INTEGER NOT NULL REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "userId" INTEGER REFERENCES "users"("id") ON DELETE CASCADE, |
| | "threadId" INTEGER REFERENCES "workspace_threads"("id") ON DELETE CASCADE, |
| | "metadata" TEXT, |
| | "tokenCountEstimate" INTEGER DEFAULT 0, |
| | "createdAt" TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, |
| | "workspace" FOREIGN KEY ("workspaceId") REFERENCES "workspaces"("id") ON DELETE CASCADE, |
| | "user" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE, |
| | "thread" FOREIGN KEY ("threadId") REFERENCES "workspace_threads"("id") ON DELETE CASCADE |
| | ); |
| | |
| | -- Create indexes for better performance |
| | CREATE INDEX "workspace_documents_workspaceId_idx" ON "workspace_documents"("workspaceId"); |
| | CREATE INDEX "workspace_chats_workspaceId_idx" ON "workspace_chats"("workspaceId"); |
| | CREATE INDEX "workspace_chats_user_id_idx" ON "workspace_chats"("user_id"); |
| | CREATE INDEX "workspace_users_user_id_idx" ON "workspace_users"("user_id"); |
| | CREATE INDEX "workspace_users_workspace_id_idx" ON "workspace_users"("workspace_id"); |
| | CREATE INDEX "workspace_threads_workspace_id_idx" ON "workspace_threads"("workspace_id"); |
| | CREATE INDEX "workspace_threads_user_id_idx" ON "workspace_threads"("user_id"); |
| | CREATE INDEX "workspace_agent_invocations_workspace_id_idx" ON "workspace_agent_invocations"("workspace_id"); |
| | CREATE INDEX "workspace_agent_invocations_user_id_idx" ON "workspace_agent_invocations"("user_id"); |
| | CREATE INDEX "workspace_agent_invocations_uuid_idx" ON "workspace_agent_invocations"("uuid"); |
| | CREATE INDEX "workspace_suggested_messages_workspaceId_idx" ON "workspace_suggested_messages"("workspaceId"); |
| | CREATE INDEX "event_logs_event_idx" ON "event_logs"("event"); |
| | CREATE INDEX "event_logs_userId_idx" ON "event_logs"("userId"); |
| | CREATE INDEX "cache_data_expiresAt_idx" ON "cache_data"("expiresAt"); |
| | CREATE INDEX "embed_configs_workspace_id_idx" ON "embed_configs"("workspace_id"); |
| | CREATE INDEX "embed_chats_embed_id_idx" ON "embed_chats"("embed_id"); |
| | CREATE INDEX "embed_chats_session_id_idx" ON "embed_chats"("session_id"); |
| | CREATE INDEX "document_sync_queues_workspaceDocId_idx" ON "document_sync_queues"("workspaceDocId"); |
| | CREATE INDEX "document_sync_executions_queueId_idx" ON "document_sync_executions"("queueId"); |
| | CREATE INDEX "slash_command_presets_uid_idx" ON "slash_command_presets"("uid"); |
| | CREATE INDEX "slash_command_presets_userId_idx" ON "slash_command_presets"("userId"); |
| | CREATE INDEX "recovery_codes_user_id_idx" ON "recovery_codes"("user_id"); |
| | CREATE INDEX "password_reset_tokens_user_id_idx" ON "password_reset_tokens"("user_id"); |
| | CREATE INDEX "password_reset_tokens_token_idx" ON "password_reset_tokens"("token"); |
| | CREATE INDEX "temporary_auth_tokens_userId_idx" ON "temporary_auth_tokens"("userId"); |
| | CREATE INDEX "temporary_auth_tokens_token_idx" ON "temporary_auth_tokens"("token"); |
| | CREATE INDEX "system_prompt_variables_userId_idx" ON "system_prompt_variables"("userId"); |
| | CREATE INDEX "prompt_history_workspaceId_idx" ON "prompt_history"("workspaceId"); |
| | CREATE INDEX "prompt_history_modifiedBy_idx" ON "prompt_history"("modifiedBy"); |
| | CREATE INDEX "desktop_mobile_devices_userId_idx" ON "desktop_mobile_devices"("userId"); |
| | CREATE INDEX "desktop_mobile_devices_token_idx" ON "desktop_mobile_devices"("token"); |
| | CREATE INDEX "workspace_parsed_files_workspaceId_idx" ON "workspace_parsed_files"("workspaceId"); |
| | CREATE INDEX "workspace_parsed_files_userId_idx" ON "workspace_parsed_files"("userId"); |
| | CREATE INDEX "workspace_parsed_files_threadId_idx" ON "workspace_parsed_files"("threadId"); |
| | `; |
| |
|
| | fs.writeFileSync(newMigrationFile, migrationSQL); |
| | console.log(`✅ 已创建新的迁移文件: ${newMigrationFile}`); |
| |
|
| | |
| | const lockFile = path.join(migrationsDir, 'migration_lock.toml'); |
| | if (fs.existsSync(lockFile)) { |
| | fs.unlinkSync(lockFile); |
| | console.log('🔓 已删除迁移锁定文件'); |
| | } |
| |
|
| | console.log('\n🎉 PostgreSQL 迁移修复完成!'); |
| | console.log('\n📋 后续步骤:'); |
| | console.log('1. 确保 DATABASE_URL 环境变量指向 PostgreSQL 数据库'); |
| | console.log('2. 运行: cd server && npx prisma migrate dev'); |
| | console.log('3. 运行: npx prisma generate'); |
| | console.log('4. 运行: npx prisma db seed'); |