diff --git a/litellm-proxy-extras/litellm_proxy_extras/migrations/20260727000000_add_verification_token_user_fkey/migration.sql b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260727000000_add_verification_token_user_fkey/migration.sql new file mode 100644 index 00000000000..fed756cd334 --- /dev/null +++ b/litellm-proxy-extras/litellm_proxy_extras/migrations/20260727000000_add_verification_token_user_fkey/migration.sql @@ -0,0 +1,15 @@ +-- Null out user_ids that reference users that no longer exist; the foreign key +-- below cannot be added over them, and ON DELETE SET NULL would have produced +-- the same rows had the constraint existed when those users were deleted +UPDATE "LiteLLM_VerificationToken" vt +SET "user_id" = NULL +WHERE vt."user_id" IS NOT NULL + AND NOT EXISTS (SELECT 1 FROM "LiteLLM_UserTable" u WHERE u."user_id" = vt."user_id"); + +-- AddForeignKey +DO $$ +BEGIN + IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = 'LiteLLM_VerificationToken_user_id_fkey') THEN + ALTER TABLE "LiteLLM_VerificationToken" ADD CONSTRAINT "LiteLLM_VerificationToken_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "LiteLLM_UserTable"("user_id") ON DELETE SET NULL ON UPDATE CASCADE; + END IF; +END $$; diff --git a/litellm/proxy/schema.prisma b/litellm/proxy/schema.prisma index 6713b212314..c336e482bfc 100644 --- a/litellm/proxy/schema.prisma +++ b/litellm/proxy/schema.prisma @@ -265,6 +265,7 @@ model LiteLLM_UserTable { invitations_updated LiteLLM_InvitationLink[] @relation("UpdatedBy") invitations_user LiteLLM_InvitationLink[] @relation("UserId") object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) + keys LiteLLM_VerificationToken[] } model LiteLLM_ObjectPermissionTable { @@ -462,6 +463,7 @@ model LiteLLM_VerificationToken { litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) litellm_project_table LiteLLM_ProjectTable? @relation(fields: [project_id], references: [project_id]) + litellm_user_table LiteLLM_UserTable? @relation(fields: [user_id], references: [user_id]) object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) jwt_key_mappings LiteLLM_JWTKeyMapping[] diff --git a/schema.prisma b/schema.prisma index 6713b212314..c336e482bfc 100644 --- a/schema.prisma +++ b/schema.prisma @@ -265,6 +265,7 @@ model LiteLLM_UserTable { invitations_updated LiteLLM_InvitationLink[] @relation("UpdatedBy") invitations_user LiteLLM_InvitationLink[] @relation("UserId") object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) + keys LiteLLM_VerificationToken[] } model LiteLLM_ObjectPermissionTable { @@ -462,6 +463,7 @@ model LiteLLM_VerificationToken { litellm_budget_table LiteLLM_BudgetTable? @relation(fields: [budget_id], references: [budget_id]) litellm_organization_table LiteLLM_OrganizationTable? @relation(fields: [organization_id], references: [organization_id]) litellm_project_table LiteLLM_ProjectTable? @relation(fields: [project_id], references: [project_id]) + litellm_user_table LiteLLM_UserTable? @relation(fields: [user_id], references: [user_id]) object_permission LiteLLM_ObjectPermissionTable? @relation(fields: [object_permission_id], references: [object_permission_id]) jwt_key_mappings LiteLLM_JWTKeyMapping[]