cascade.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. """
  2. 级联删除:Greenplum 不支持 FK ON DELETE CASCADE,由应用层保证。
  3. 用法:
  4. from knowhub.knowhub_db.cascade import cascade_delete
  5. cascade_delete(cursor, 'knowledge', knowledge_id)
  6. """
  7. # 每个实体表涉及的关联表及其外键列名
  8. _JUNCTIONS = {
  9. 'knowledge': [
  10. ('requirement_knowledge', 'knowledge_id'),
  11. ('capability_knowledge', 'knowledge_id'),
  12. ('tool_knowledge', 'knowledge_id'),
  13. ('knowledge_resource', 'knowledge_id'),
  14. ('knowledge_relation', 'source_id'),
  15. ('knowledge_relation', 'target_id'),
  16. ],
  17. 'tool': [
  18. ('capability_tool', 'tool_id'),
  19. ('tool_knowledge', 'tool_id'),
  20. ('tool_provider', 'tool_id'),
  21. ],
  22. 'capability': [
  23. ('requirement_capability', 'capability_id'),
  24. ('capability_tool', 'capability_id'),
  25. ('capability_knowledge', 'capability_id'),
  26. ],
  27. 'requirement': [
  28. ('requirement_capability', 'requirement_id'),
  29. ('requirement_knowledge', 'requirement_id'),
  30. ],
  31. 'resource': [
  32. ('knowledge_resource', 'resource_id'),
  33. ],
  34. }
  35. def cascade_delete(cursor, entity_table: str, entity_id: str):
  36. """先删除关联表中的引用行,再删除实体本身"""
  37. for junction_table, fk_column in _JUNCTIONS.get(entity_table, []):
  38. cursor.execute(
  39. f"DELETE FROM {junction_table} WHERE {fk_column} = %s",
  40. (entity_id,))
  41. cursor.execute(
  42. f"DELETE FROM {entity_table} WHERE id = %s",
  43. (entity_id,))