@@ -116,18 +116,28 @@ async def delete(
116116 ).demand (storage .AccessError (f"Release '{ project_name } { version } ' not found." ))
117117 release_dir = util .release_directory_base (release )
118118
119- # Delete from the database
119+ # Delete from the database using bulk SQL DELETE for efficiency
120120 log .info (f"Deleting database records for release: { project_name } { version } " )
121- # Cascade should handle this, but we delete manually anyway
122- tasks_to_delete = await self .__data .task (project_name = release .project .name , version_name = release .version ).all ()
123- for task in tasks_to_delete :
124- await self .__data .delete (task )
125- log .debug (f"Deleted { util .plural (len (tasks_to_delete ), 'task' )} for { project_name } { version } " )
126-
127- checks_to_delete = await self .__data .check_result (release_name = release .name ).all ()
128- for check in checks_to_delete :
129- await self .__data .delete (check )
130- log .debug (f"Deleted { util .plural (len (checks_to_delete ), 'check result' )} for { project_name } { version } " )
121+
122+ # Bulk delete tasks
123+ # These is no cascade, so we must delete explicitly
124+ via = sql .validate_instrumented_attribute
125+ task_delete_stmt = sqlmodel .delete (sql .Task ).where (
126+ via (sql .Task .project_name ) == release .project .name ,
127+ via (sql .Task .version_name ) == release .version ,
128+ )
129+ task_result = await self .__data .execute (task_delete_stmt )
130+ task_count = task_result .rowcount if isinstance (task_result , engine .CursorResult ) else 0
131+ log .debug (f"Deleted { util .plural (task_count , 'task' )} for { project_name } { version } " )
132+
133+ # Bulk delete check results
134+ # Handled by cascade, but we do this explicitly anyway
135+ check_delete_stmt = sqlmodel .delete (sql .CheckResult ).where (
136+ via (sql .CheckResult .release_name ) == release .name ,
137+ )
138+ check_result = await self .__data .execute (check_delete_stmt )
139+ check_count = check_result .rowcount if isinstance (check_result , engine .CursorResult ) else 0
140+ log .debug (f"Deleted { util .plural (check_count , 'check result' )} for { project_name } { version } " )
131141
132142 # TODO: Ensure that revisions are not deleted
133143 # But this makes testing difficult
0 commit comments