feat: работа с орфанными записями

This commit is contained in:
2026-04-24 15:58:29 +03:00
parent 87444b5718
commit c63beeef0c
5 changed files with 75 additions and 9 deletions

View File

@@ -52,6 +52,7 @@ check_if_table_is_exist_and_init_if_not = function(
schm = schm
)
# инициализируем все таблицы
} else {
if (table_name == "main") {
@@ -61,6 +62,7 @@ check_if_table_is_exist_and_init_if_not = function(
.before = 1
)
}
if (table_name != "main") {
dummy_df <- get_dummy_df(forms_id_type_list) |>
dplyr::mutate(
@@ -401,4 +403,61 @@ local_db_backup <- function(
}
}
)
}
}
#' @export
db_clean_orphans = function(schm, con) {
main_key <- schm$get_main_key_id
nested_tables <- schm$nested_tables_names
all_main_keys <- DBI::dbGetQuery(con, glue::glue("SELECT DISTINCT {main_key} FROM main"))
all_main_keys <- dplyr::pull(all_main_keys)
purrr::walk(
.x = nested_tables,
.f = \(table_name) clear_orphans(table_name = table_name, main_key = main_key, all_main_keys = all_main_keys, con = con)
)
clear_orphans(table_name = "tasks", main_key = "task_main_key", all_main_keys = all_main_keys, con = con, drop_na_keys = FALSE)
clear_orphans(table_name = "log", main_key = "key", all_main_keys = all_main_keys, con = con, drop_na_keys = FALSE)
}
clear_orphans <- function(
table_name,
main_key,
all_main_keys,
con,
drop_na_keys = TRUE
) {
if (!table_name %in% DBI::dbListTables(con)) return(invisible())
all_main_keys_from_nested <- DBI::dbGetQuery(con, glue::glue("SELECT DISTINCT {main_key} FROM {table_name}"))
all_main_keys_from_nested <- dplyr::pull(all_main_keys_from_nested)
if (!drop_na_keys) {
all_main_keys_from_nested <- all_main_keys_from_nested[!is.na(all_main_keys_from_nested)]
}
if (all(all_main_keys_from_nested %in% all_main_keys)) {
cli::cli_alert_success("Все ключи в таблице '{table_name}' соответствуют действующим")
} else {
orphaned_keys <- all_main_keys_from_nested[!all_main_keys_from_nested %in% all_main_keys]
cli::cli_alert_warning(c("В таблице '{table_name}' найдены орфанные записи для следующих ID: ", paste("\n -", orphaned_keys)))
orphaned_keys <- paste0("'", orphaned_keys, "'", collapse = ", ")
del_query <- glue::glue("DELETE FROM {table_name} WHERE {main_key} IN ({orphaned_keys})")
deleted <- DBI::dbExecute(con, del_query)
if (drop_na_keys) {
deleted <- deleted + DBI::dbExecute(con, glue::glue("DELETE FROM {table_name} WHERE {main_key} IS NULL"))
}
cli::cli_alert_success("Из таблицы '{table_name}' было удалено {deleted} орфанных записей")
}
}