Skip to content

Commit 25d368a

Browse files
committed
#151 part 2
1 parent b42b239 commit 25d368a

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

datajoint/table.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -486,6 +486,7 @@ def delete(
486486
transaction: bool = True,
487487
safemode: Union[bool, None] = None,
488488
force_parts: bool = False,
489+
include_master: bool = True,
489490
) -> int:
490491
"""
491492
Deletes the contents of the table and its dependent tables, recursively.
@@ -497,6 +498,7 @@ def delete(
497498
safemode: If `True`, prohibit nested transactions and prompt to confirm. Default
498499
is `dj.config['safemode']`.
499500
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`.
500502
501503
Returns:
502504
Number of deleted rows (excluding those from dependent tables).
@@ -565,7 +567,22 @@ def cascade(table):
565567
)
566568
else:
567569
child &= table.proj()
570+
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(),
579+
)
580+
]
581+
568582
cascade(child)
583+
584+
if include_master and master and master not in deleted:
585+
cascade(master_table)
569586
else:
570587
deleted.add(table.full_table_name)
571588
logger.info(

tests/test_cascading_delete.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,11 +110,17 @@ def test_delete_master(schema_simp_pop):
110110
Profile().delete()
111111

112112

113-
def test_delete_parts(schema_simp_pop):
113+
def test_delete_parts_error(schema_simp_pop):
114114
"""test issue #151"""
115115
with pytest.raises(dj.DataJointError):
116116
Profile().populate_random()
117-
Website().delete()
117+
Website().delete(include_master=False)
118+
119+
120+
def test_delete_parts(schema_simp_pop):
121+
"""test issue #151"""
122+
Profile().populate_random()
123+
Website().delete(include_master=True)
118124

119125

120126
def test_drop_part(schema_simp_pop):

0 commit comments

Comments
 (0)