migrate_image_urls.sql 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. -- ============================================================
  2. -- 图片 URL 迁移:/images/drugs/ → /images/
  3. -- ============================================================
  4. -- 执行方式:
  5. -- docker exec -i pharmacopoeia-pg psql -U postgres -d pharmacopoeia < database/migrate_image_urls.sql
  6. --
  7. -- 回滚方式:
  8. -- 将下面 SQL 中的 /images/" 替换为 /images/drugs/" 再执行一遍
  9. -- ============================================================
  10. BEGIN;
  11. -- 1. 更新 drugs.sections (jsonb) 中的 <img> 标签 URL
  12. -- sections 是 jsonb,需要 text → regexp_replace → jsonb 来回转
  13. UPDATE drugs
  14. SET sections = regexp_replace(sections::text, '/images/drugs/', '/images/', 'g')::jsonb
  15. WHERE sections::text LIKE '%/images/drugs/%';
  16. -- 2. 更新 drug_chunks.content (text) 中的 <img> 标签 URL
  17. UPDATE drug_chunks
  18. SET content = replace(content, '/images/drugs/', '/images/')
  19. WHERE content LIKE '%/images/drugs/%';
  20. -- 3. 验证:确认无残留旧 URL
  21. DO $$
  22. DECLARE
  23. drugs_old INT;
  24. chunks_old INT;
  25. BEGIN
  26. SELECT COUNT(*) INTO drugs_old FROM drugs
  27. WHERE sections::text LIKE '%/images/drugs/%';
  28. SELECT COUNT(*) INTO chunks_old FROM drug_chunks
  29. WHERE content LIKE '%/images/drugs/%';
  30. RAISE NOTICE '旧 URL 残留: drugs=% chunks=%', drugs_old, chunks_old;
  31. IF drugs_old > 0 OR chunks_old > 0 THEN
  32. RAISE WARNING '仍有旧 URL 残留,请检查!';
  33. ELSE
  34. RAISE NOTICE '✅ 迁移完成,无旧 URL 残留';
  35. END IF;
  36. END $$;
  37. COMMIT;