feat: работа с орфанными записями
This commit is contained in:
61
modules/db.R
61
modules/db.R
@@ -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} орфанных записей")
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user