Skip to content

Commit 7ae1bfc

Browse files
Merge pull request #912 from dimitri-yatsenko/master
fix the counting of deleted items. Issue #897
2 parents 432624c + 1ea96e6 commit 7ae1bfc

File tree

5 files changed

+17
-8
lines changed

5 files changed

+17
-8
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
### 0.13.2 -- TBD
44
* Bugfix - Explicit calls to `dj.Connection` throw error due to missing `host_input` (#895) PR #907
5+
* Bugfix - Correct count of deleted items. (#897) PR #912
56

67
### 0.13.1 -- Apr 16, 2021
78
* Add `None` as an alias for `IS NULL` comparison in `dict` restrictions (#824) PR #893

datajoint/external.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -321,10 +321,12 @@ def delete(self, *, delete_external_files=None, limit=None, display_progress=Tru
321321
themselves are deleted too.
322322
:param limit: (integer) limit the number of items to delete
323323
:param display_progress: if True, display progress as files are cleaned up
324-
:return: yields
324+
:return: if deleting external files, returns errors
325325
"""
326326
if delete_external_files not in (True, False):
327-
raise DataJointError("The delete_external_files argument must be set to either True or False in delete()")
327+
raise DataJointError(
328+
"The delete_external_files argument must be set to either "
329+
"True or False in delete()")
328330

329331
if not delete_external_files:
330332
self.unused().delete_quick()

datajoint/table.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -351,10 +351,9 @@ def delete_quick(self, get_count=False):
351351
def _delete_cascade(self):
352352
"""service function to perform cascading deletes recursively."""
353353
max_attempts = 50
354-
delete_count = 0
355354
for _ in range(max_attempts):
356355
try:
357-
delete_count += self.delete_quick(get_count=True)
356+
delete_count = self.delete_quick(get_count=True)
358357
except IntegrityError as error:
359358
match = foreign_key_error_regexp.match(error.args[0]).groupdict()
360359
if "`.`" not in match['child']: # if schema name missing, use self
@@ -383,7 +382,7 @@ def _delete_cascade(self):
383382
match['pk_attrs'])))
384383
else:
385384
child &= self.proj()
386-
delete_count += child._delete_cascade()
385+
child._delete_cascade()
387386
else:
388387
print("Deleting {count} rows from {table}".format(
389388
count=delete_count, table=self.full_table_name))
@@ -399,6 +398,7 @@ def delete(self, transaction=True, safemode=None):
399398
:param transaction: if True, use the entire delete becomes an atomic transaction.
400399
:param safemode: If True, prohibit nested transactions and prompt to confirm. Default
401400
is dj.config['safemode'].
401+
:return: number of deleted rows (excluding those from dependent tables)
402402
"""
403403
safemode = config['safemode'] if safemode is None else safemode
404404

@@ -439,6 +439,7 @@ def delete(self, transaction=True, safemode=None):
439439
self.connection.cancel_transaction()
440440
if safemode:
441441
print('Deletes cancelled')
442+
return delete_count
442443

443444
def drop_quick(self):
444445
"""
@@ -822,8 +823,11 @@ def __call__(self, event, skip_logging=None):
822823
logger.info('could not log event in table ~log')
823824

824825
def delete(self):
825-
"""bypass interactive prompts and cascading dependencies"""
826-
self.delete_quick()
826+
"""
827+
bypass interactive prompts and cascading dependencies
828+
:return: number of deleted items
829+
"""
830+
return self.delete_quick(get_count=True)
827831

828832
def drop(self):
829833
"""bypass interactive prompts and cascading dependencies"""

docs-parts/intro/Releases_lang1.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
0.13.2 -- TBD
22
-------------
33
* Bugfix - Explicit calls to `dj.Connection` throw error due to missing `host_input` (#895) PR #907
4+
* Bugfix - Correct count of deleted items. (#897) PR #912
45

56
0.13.1 -- Apr 16, 2021
67
----------------------

tests/test_foreign_keys.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@ def test_aliased_fk():
1818
parents = person * parent * link
1919
parents &= dict(full_name="May K. Hall")
2020
assert_equal(set(parents.fetch('parent_name')), {'Hanna R. Walters', 'Russel S. James'})
21-
person.delete()
21+
delete_count = person.delete()
22+
assert delete_count == 16
2223

2324

2425
def test_describe():

0 commit comments

Comments
 (0)