diff --git a/dev/flat_additional.Rmd b/dev/flat_additional.Rmd index c83bc18ede9dfe71141e4412c2cd01cfac863b51..657bcd949dfd589dc098b2cb64228d1a1dc0ab04 100644 --- a/dev/flat_additional.Rmd +++ b/dev/flat_additional.Rmd @@ -80,71 +80,54 @@ table_exists(connexion, #' ses commentaires dans une nouvelle table avec la date et l'heure en suffixe. #' #' @param connexion Connexion active à la base de données PostgreSQL -#' @param table_name Nom de la table à archiver dans la base de données +#' @param database Nom de la base de données de la table à archiver #' @param schema Schéma de la table à archiver #' @param new_schema Schéma de destination de la nouvelle table archivée (par #' défaut NULL, utilise le schéma d'origine) +#' @param table_name Nom de la table à archiver dans la base de données #' #' @return Le nom de la nouvelle table archivée #' #' @importFrom DBI dbGetInfo dbGetQuery dbSendQuery #' #' @export -archive_table <- function(connexion, table_name, schema, new_schema = NULL) { +archive_table <- function(connexion, database, schema, new_schema = NULL, + table_name) { # Vérifier si la table existe dans la base de données if (!inherits(connexion, "PostgreSQLConnection")) { stop("La connexion fournie n\'est pas une connexion PostgreSQL valide.") } - - if (!table_exists(connexion, table_name, schema, dbGetInfo(connexion)$dbname)) { + + if (!collectr::table_exists(connexion, table_name, schema, DBI::dbGetInfo(connexion)$dbname)) { stop("La table sp\u00e9cifi\u00e9e n\'existe pas dans la base de donn\u00e9es.") } - + # Obtenir la date et l'heure actuelles au format "yyyymmddHHMM" archive_datetime <- format(Sys.time(), format = "%Y%m%d%H%M") - - # Créer un nom pour la nouvelle table archivée avec la date et l'heure en suffixe + + # Sélectionner la valeur du schéma if (is.null(new_schema)) { - new_table_name <- paste0(schema, ".", table_name, "_", archive_datetime ) + schema = schema } else { - new_table_name <- paste0(new_schema, ".", table_name, "_", archive_datetime ) + schema = new_schema } - + + # Créer un nom pour la nouvelle table archivée avec la date et l'heure en suffixe + new_table_name <- paste0(schema, ".", table_name, "_", archive_datetime ) + # Copier la table dans la nouvelle table archivée query <- paste("CREATE TABLE", new_table_name, "AS SELECT * FROM", schema, ".", table_name ) - dbSendQuery(connexion, query) - - # Récupérer le commentaire de la table existante - comment_query <- paste("SELECT description FROM pg_description - WHERE objoid = \'", schema, ".", table_name, "\'::regclass") - comment_table <- dbGetQuery(connexion, comment_query)$description - - # Copier le commentaire de la table dans la nouvelle table archivée - query <- paste("COMMENT ON TABLE", new_table_name, "IS \'", comment_table, "\'") - dbSendQuery(connexion, query) - - # Récupérer les commentaires des champs de la table existante - fields_query <- paste("SELECT a.attname, pd.description - FROM pg_attribute a - LEFT JOIN pg_description pd ON a.attrelid = pd.objoid AND a.attnum = pd.objsubid - WHERE a.attrelid = '", schema, ".", table_name, "'::regclass AND a.attnum > 0;") - fields_comments <- dbGetQuery(connexion, fields_query) - - for (i in seq_len(nrow(fields_comments))) { - field_name <- fields_comments[i, "attname"] - field_comment <- fields_comments[i, "description"] - - if (!is.na(field_comment)) { - # Échapper les apostrophes dans le commentaire - escaped_comment <- gsub("\'", "\'\'", field_comment) - - # Ajouter le commentaire du champ dans la nouvelle table archivée - query <- paste("COMMENT ON COLUMN", new_table_name, ".", field_name, "IS \'", escaped_comment, "\'") - dbSendQuery(connexion, query) - } - } - + DBI::dbSendQuery(connexion, query) + + # Copier les commentaires de la table dans la nouvelle table archivée + datalibaba::transferer_table_comments(table_sce = table_name, + schema_sce = schema, + db_sce = database, + table_dest = paste0(table_name, "_", archive_datetime ), + schema_dest = schema, + db_dest = database) + # Retourner le nom de la nouvelle table archivée return(new_table_name) } @@ -154,12 +137,14 @@ archive_table <- function(connexion, table_name, schema, new_schema = NULL) { ```{r examples-archive_table} connexion <- datalibaba::connect_to_db(db = "si_eau") archive_table(connexion, - table_name = "bassin_hydrographie_fxx", - schema = "bdtopage") + database = "si_eau", + schema = "bdtopage", + table_name = "bassin_hydrographie_fxx") archive_table(connexion, - table_name = "bassin_hydrographie_fxx", + database = "si_eau", schema = "bdtopage", - new_schema = "zz_archives") + new_schema = "zz_archives", + table_name = "bassin_hydrographie_fxx") ```