@@ -127,7 +127,10 @@ def _remove_external_file(self, external_path):
127127 if self .spec ['protocol' ] == 's3' :
128128 self .s3 .remove_object (external_path )
129129 elif self .spec ['protocol' ] == 'file' :
130- Path (external_path ).unlink ()
130+ try :
131+ Path (external_path ).unlink ()
132+ except FileNotFoundError :
133+ pass
131134
132135 def exists (self , external_filepath ):
133136 """
@@ -314,11 +317,12 @@ def used(self):
314317 return self & [FreeTable (self .connection , ref ['referencing_table' ]).proj (hash = ref ['column_name' ])
315318 for ref in self .references ]
316319
317- def delete (self , * , delete_external_files = None , limit = None , display_progress = True ):
320+ def delete (self , * , delete_external_files = None , limit = None , display_progress = True , errors_as_string = True ):
318321 """
319322 :param delete_external_files: True or False. If False, only the tracking info is removed from the
320323 external store table but the external files remain intact. If True, then the external files
321324 themselves are deleted too.
325+ :param errors_as_string: If True any errors returned when deleting from external files will be strings
322326 :param limit: (integer) limit the number of items to delete
323327 :param display_progress: if True, display progress as files are cleaned up
324328 :return: if deleting external files, returns errors
@@ -337,16 +341,20 @@ def delete(self, *, delete_external_files=None, limit=None, display_progress=Tru
337341 # delete items one by one, close to transaction-safe
338342 error_list = []
339343 for uuid , external_path in items :
340- try :
341- count = (self & {'hash' : uuid }).delete_quick (get_count = True ) # optimize
342- except Exception :
343- pass # if delete failed, do not remove the external file
344- else :
345- assert count in (0 , 1 )
344+ row = (self & {'hash' : uuid }).fetch ()
345+ if row .size :
346346 try :
347- self ._remove_external_file (external_path )
348- except Exception as error :
349- error_list .append ((uuid , external_path , str (error )))
347+ (self & {'hash' : uuid }).delete_quick ()
348+ except Exception :
349+ pass # if delete failed, do not remove the external file
350+ else :
351+ try :
352+ self ._remove_external_file (external_path )
353+ except Exception as error :
354+ # adding row back into table after failed delete
355+ self .insert1 (row [0 ], skip_duplicates = True )
356+ error_list .append ((uuid , external_path ,
357+ str (error ) if errors_as_string else error ))
350358 return error_list
351359
352360
0 commit comments