@@ -486,7 +486,7 @@ def delete(
486486 transaction : bool = True ,
487487 safemode : Union [bool , None ] = None ,
488488 force_parts : bool = False ,
489- include_master : bool = True ,
489+ include_parts : bool = True ,
490490 ) -> int :
491491 """
492492 Deletes the contents of the table and its dependent tables, recursively.
@@ -498,7 +498,8 @@ def delete(
498498 safemode: If `True`, prohibit nested transactions and prompt to confirm. Default
499499 is `dj.config['safemode']`.
500500 force_parts: Delete from parts even when not deleting from their masters.
501- include_master: If `True`, delete from the master table as well. Default is `True`.
501+ include_parts: If `True`, include part/master pairs in the cascade.
502+ Default is `True`.
502503
503504 Returns:
504505 Number of deleted rows (excluding those from dependent tables).
@@ -509,6 +510,7 @@ def delete(
509510 DataJointError: Deleting a part table before its master.
510511 """
511512 deleted = set ()
513+ visited_masters = set ()
512514
513515 def cascade (table ):
514516 """service function to perform cascading deletes recursively."""
@@ -568,25 +570,30 @@ def cascade(table):
568570 else :
569571 child &= table .proj ()
570572
571- master = get_master (child .full_table_name )
572- if include_master and master and master not in deleted :
573- master_table = FreeTable (table .connection , master )
574- master_table ._restriction = [
575- make_condition (
576- master_table ,
577- (master_table & child ).proj ().fetch (),
578- set (),
573+ master_name = get_master (child .full_table_name )
574+ if (
575+ include_parts
576+ and master_name
577+ and master_name != table .full_table_name
578+ and master_name not in visited_masters
579+ ):
580+ master = FreeTable (table .connection , master_name )
581+ master ._restriction_attributes = set ()
582+ master ._restriction = [
583+ make_condition ( # &= may cause in target tables in subquery
584+ master ,
585+ (master .proj () & child .proj ()).fetch (),
586+ master ._restriction_attributes ,
579587 )
580588 ]
581-
582- cascade (child )
583-
584- if include_master and master and master not in deleted :
585- cascade (master_table )
589+ visited_masters .add (master_name )
590+ cascade (master )
591+ else :
592+ cascade (child )
586593 else :
587594 deleted .add (table .full_table_name )
588595 logger .info (
589- "Deleting {count} rows from {table}" .format (
596+ "Deleting: {count} rows from {table}" .format (
590597 count = delete_count , table = table .full_table_name
591598 )
592599 )
0 commit comments