Guest User

Untitled

a guest
May 26th, 2018
117
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.44 KB | None | 0 0
  1. SQLAlchemy的级联删除
  2.  
  3. 我在做在线相册的时候,碰到这么一个需求,1个相册多张图片,1个图片可以被多个用户喜欢,1个用户可以喜欢多个图片。
  4.  
  5. 相册与图片的关系是1:M
  6.  
  7. 图片与用户的关系是N:M
  8.  
  9. 当我想删除这个相册的时候,如果直接删除是会报错的
  10.  
  11. sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'photo_like' expected to delete 1 row(s); Only 0 were matched.
  12.  
  13. 这个时候需要给Photo的喜欢关系添加passive_deletes: 使得其支持关联(被动)删除,设置为True。
  14.  
  15. 直接上案例,有 A,B,C,AB,AC五张表
  16.  
  17. class A(base):
  18.  
  19. tablename = "a"
  20.  
  21. id = Column(Integer, primary_key=True)
  22.  
  23. b = relationship('B', secondary=AB, cascade="delete, delete-orphan", single_parent=True)
  24.  
  25. c = relationship('C', secondary=AC, cascade="delete, delete-orphan", single_parent=True)
  26.  
  27. class B(base):
  28.  
  29. tablename = "b"
  30.  
  31. id = Column(Integer, primary_key=True)
  32.  
  33. rules = relationship('A', secondary=AB, cascade="delete, delete-orphan", single_parent=True, passive_deletes=True)
  34.  
  35. class C(base):
  36.  
  37. tablename = "c"
  38.  
  39. id = Column(Integer, primary_key=True)
  40.  
  41. rules = relationship('A', secondary=AC, cascade="delete, delete-orphan", single_parent=True, passive_deletes=True)
  42.  
  43. AB = Table(
  44.  
  45. "AB", Base.metadata,
  46.  
  47. Column("A_id", Integer, ForeignKey("A.id")),
  48.  
  49. Column("B_id", Integer, ForeignKey("B.id"))
  50.  
  51. )
  52.  
  53. AC = Table(
  54.  
  55. "AC", Base.metadata,
  56.  
  57. Column("A_id", Integer, ForeignKey("A.id")),
  58.  
  59. Column("C_id", Integer, ForeignKey("C.id"))
  60.  
  61. )
  62.  
  63.  
  64.  
  65.  
  66. 关系是:
  67.  
  68. A表对B表多对多,关系存放在AB表
  69.  
  70. A表对C表多对多,关系存放在AC表
  71.  
  72. 操作:
  73.  
  74. 删除A表的数据时,同时删除B,C,AB,AC表与A相关联的数据。
  75.  
  76. secondary:多对多关联类
  77.  
  78. cascade:设置级联关系,删除用delete, delete-orphan
  79.  
  80. single_parent:让级联支持多对多,设置为True
  81.  
  82. 没有此属性会报异常:On X.x, delete-orphan cascade is not supported on a many-to-many or many-to-one relationship when single_parent is not set. Set single_parent=True on the relationship().
  83.  
  84. passive_deletes: 支持关联(被动)删除,设置为True
  85.  
  86. 没有此属性会报异常:DELETE statement on table 'B' expected to delete 1 row(s); Only 0 were matched.
Add Comment
Please, Sign In to add comment