diff --git a/R/create_dummy.R b/R/create_dummy.R index faa2ec5c8d398bbd425b748644ad39889f69ca78..1fe3b81a00e5aac4d4335522ba849e6ef5f7cb9f 100644 --- a/R/create_dummy.R +++ b/R/create_dummy.R @@ -9,6 +9,7 @@ #' @param schema Nom du schéma dans lequel créer la table. #' @param table Nom de la table à créer. #' @param pk Clé primaire de la table à créer. NULL par défaut. +#' @param id_range Plage de 5 valeurs de l'identifiant id. 1:5 par défaut. #' @param role Nom du rôle (utilisateur) pour se connecter à la base de données. #' #' @return Un message indiquant si la table a été créée avec succès. @@ -26,9 +27,12 @@ #' database = "collectr", #' schema = "public", #' table = "dummy", +#' pk = NULL, +#' id_range = "1:5" #' role = "runner") #' } -create_dummy <- function(host, database, schema, table, pk = NULL, role) { +create_dummy <- function(host, database, schema, table, pk = NULL, + id_range = "1:5", role) { # Se connecter à la base de données PostgreSQL connexion <- datalibaba::connect_to_db(server = host, db = database, @@ -40,9 +44,12 @@ create_dummy <- function(host, database, schema, table, pk = NULL, role) { stop("La connexion fournie n\'est pas une connexion PostgreSQL valide.") } + # Générer dynamiquement la plage d'ID + id_values <- eval(parse(text = id_range)) + # Créer un dataframe fictif df <- data.frame( - id = 1:5, + id = id_values, name = c("Alice", "Bob", "Charlie", "David", "Eve"), birthdate = c("1990-01-15", "1985-06-22", "1992-09-10", "1988-03-05", "1995-12-30"), value = rnorm(5) diff --git a/R/import_and_merge_tables.R b/R/import_and_merge_tables.R index 93d4d1c6d61d555c8829a1b3cf6e97dad4486ba9..ac35de3940a895337f001649159625dc3eaf7e23 100644 --- a/R/import_and_merge_tables.R +++ b/R/import_and_merge_tables.R @@ -1,19 +1,20 @@ #' Importe et fusionne les données de tables PostgreSQL #' -#' @description Cette fonction permet d'importer les données d'une table -#' PostgreSQL dans une autre table en supprimant les champs absents dans l'une +#' @description Cette fonction permet d'importer les données d'une table +#' PostgreSQL dans une autre table en supprimant les champs absents dans l'une #' ou l'autre des tables. #' +#' @param host Hôte de la base de données PostgreSQL. #' @param database Nom de la base de données. -#' @param source_table Le nom de la table source à partir de laquelle importer +#' @param source_table Le nom de la table source à partir de laquelle importer #' les données. #' @param source_schema Le schéma de la table source. #' @param target_table Le nom de la table cible où les données seront fusionnées. #' @param target_schema Le schéma de la table cible. #' @param role Le rôle du propriétaire de la table. #' -#' @return TRUE si l'importation et la fusion des données se sont déroulées +#' @return TRUE si l'importation et la fusion des données se sont déroulées #' avec succès. #' #' @importFrom datalibaba connect_to_db @@ -22,59 +23,79 @@ #' @export #' @examples #' \dontrun{ +#' # Créer une table dummy dans le schéma collectr de la base production +#' create_dummy(host = "localhost", +#' database = "collectr", +#' schema = "public", +#' table = "source", +#' pk = "id", +#' role = "runner") +#' # Créer une table dummy dans le schéma collectr de la base production +#' create_dummy(host = "localhost", +#' database = "collectr", +#' schema = "public", +#' table = "target", +#' pk = "id", +#' id_range = "6:10", +#' role = "runner") #' # Utilisation de la fonction import_and_merge_tables() -#' import_and_merge_tables(database = "si_eau", -#' source_table = "nitrate_data_analyse_ars_2023", -#' source_schema = "nitrates", -#' target_table = "nitrate_data_analyse_ars_test", -#' target_schema = "nitrates", -#' role = "admin") +#' import_and_merge_tables(host = "localhost", +#' database = "collectr", +#' source_table = "source", +#' source_schema = "public", +#' target_table = "target", +#' target_schema = "public", +#' role = "runner") #' } -import_and_merge_tables <- function(database, source_table, source_schema, +import_and_merge_tables <- function(host, database, source_table, source_schema, target_table, target_schema, role) { # Se connecter à la base de données PostgreSQL - connexion <- datalibaba::connect_to_db(db = database, - user = role, + connexion <- datalibaba::connect_to_db(db = database, + user = role, + server = host, ecoSQL = FALSE) - + # Vérifier si la connexion est une connexion PostgreSQL valide if (!inherits(connexion, "PostgreSQLConnection")) { stop("La connexion fournie n\'est pas une connexion PostgreSQL valide.") } # Vérifier si les tables source et cible existent dans les schémas respectifs - if (!table_exists(database = database, schema = source_schema, table = source_table, role = role)) { + if (!table_exists(host = host, database = database, schema = source_schema, + table = source_table, role = role)) { stop("La table source sp\u00e9cifi\u00e9e n\'existe pas dans la base de donn\u00e9es.") } - if (!table_exists(database = database, schema = target_schema, table = target_table, role = role)) { + if (!table_exists(host = host, database = database, schema = target_schema, + table = target_table, role = role)) { stop("La table cible sp\u00e9cifi\u00e9e n\'existe pas dans la base de donn\u00e9es.") } # Obtenir la liste des colonnes communes entre la table source et la table cible existing_source_result <- DBI::dbGetQuery( - connexion, - paste0("SELECT column_name FROM information_schema.columns - WHERE table_schema = '", source_schema,"' + connexion, + paste0("SELECT column_name FROM information_schema.columns + WHERE table_schema = '", source_schema,"' AND table_name = '", source_table, "';")) existing_target_result <- DBI::dbGetQuery( - connexion, - paste0("SELECT column_name FROM information_schema.columns - WHERE table_schema = '", target_schema,"' + connexion, + paste0("SELECT column_name FROM information_schema.columns + WHERE table_schema = '", target_schema,"' AND table_name = '", target_table, "';")) source_columns <- existing_source_result$column_name target_columns <- existing_target_result$column_name common_columns <- intersect(source_columns, target_columns) - + # Générer la requête d'insertion en sélectionnant uniquement les colonnes communes insert_query <- paste0("INSERT INTO ", target_schema, ".", target_table, " (", paste(common_columns, collapse = ", "), ")", " SELECT ", paste(common_columns, collapse = ", "), " FROM ", source_schema, ".", source_table) - + # Insérer les données dans la table cible DBI::dbExecute(connexion, insert_query) # Fermer la connexion à la base de données DBI::dbDisconnect(connexion) - + + # Retourner TRUE en cas de succès return(TRUE) } diff --git a/dev/0-dev_history.Rmd b/dev/0-dev_history.Rmd index e545891433edfc668916a66d259352e51fba7b4a..9309763eb6a8369ff7c574f25bdefd434e024582 100644 --- a/dev/0-dev_history.Rmd +++ b/dev/0-dev_history.Rmd @@ -83,6 +83,7 @@ usethis::use_r("download_and_extract_wfs") usethis::use_r("format_colnames") usethis::use_r("format_filepath") usethis::use_r("get_variable_completion_rate") +usethis::use_r("import_and_merge_tables") usethis::use_r("import_geopackage") usethis::use_r("import_shapefile") usethis::use_r("import_xlsx") @@ -105,6 +106,7 @@ usethis::use_test("download_and_extract_wfs") usethis::use_test("format_colnames") usethis::use_test("format_filepath") usethis::use_test("get_variable_completion_rate") +usethis::use_test("import_and_merge_tables") usethis::use_test("import_geopackage") usethis::use_test("import_shapefile") usethis::use_test("import_xlsx") diff --git a/man/create_dummy.Rd b/man/create_dummy.Rd index 20c3bcd7277e296b8b888a0c1d4405ade4cebb0d..0fb84ed23786d3895f9e0eb25d303cb79b4fd0c4 100644 --- a/man/create_dummy.Rd +++ b/man/create_dummy.Rd @@ -4,7 +4,7 @@ \alias{create_dummy} \title{Crée une table de test dans une base de données PostgreSQL} \usage{ -create_dummy(host, database, schema, table, pk = NULL, role) +create_dummy(host, database, schema, table, pk = NULL, id_range = "1:5", role) } \arguments{ \item{host}{Hôte de la base de données PostgreSQL.} @@ -17,6 +17,8 @@ create_dummy(host, database, schema, table, pk = NULL, role) \item{pk}{Clé primaire de la table à créer. NULL par défaut.} +\item{id_range}{Plage de 5 valeurs de l'identifiant id. 1:5 par défaut.} + \item{role}{Nom du rôle (utilisateur) pour se connecter à la base de données.} } \value{ @@ -33,6 +35,8 @@ create_dummy(host = "localhost", database = "collectr", schema = "public", table = "dummy", + pk = NULL, + id_range = "1:5" role = "runner") } } diff --git a/man/import_and_merge_tables.Rd b/man/import_and_merge_tables.Rd index 1c324093ec206cfd423c7f0da66654635beb0150..274bad8e5797a08cca18c463f2d981b459bcd522 100644 --- a/man/import_and_merge_tables.Rd +++ b/man/import_and_merge_tables.Rd @@ -5,6 +5,7 @@ \title{Importe et fusionne les données de tables PostgreSQL} \usage{ import_and_merge_tables( + host, database, source_table, source_schema, @@ -14,6 +15,8 @@ import_and_merge_tables( ) } \arguments{ +\item{host}{Hôte de la base de données PostgreSQL.} + \item{database}{Nom de la base de données.} \item{source_table}{Le nom de la table source à partir de laquelle importer @@ -38,12 +41,28 @@ ou l'autre des tables. } \examples{ \dontrun{ +# Créer une table dummy dans le schéma collectr de la base production +create_dummy(host = "localhost", + database = "collectr", + schema = "public", + table = "source", + pk = "id", + role = "runner") +# Créer une table dummy dans le schéma collectr de la base production +create_dummy(host = "localhost", + database = "collectr", + schema = "public", + table = "target", + pk = "id", + id_range = "6:10", + role = "runner") # Utilisation de la fonction import_and_merge_tables() -import_and_merge_tables(database = "si_eau", - source_table = "nitrate_data_analyse_ars_2023", - source_schema = "nitrates", - target_table = "nitrate_data_analyse_ars_test", - target_schema = "nitrates", - role = "admin") +import_and_merge_tables(host = "localhost", + database = "collectr", + source_table = "source", + source_schema = "public", + target_table = "target", + target_schema = "public", + role = "runner") } } diff --git a/tests/testthat/test-import_and_merge_tables.R b/tests/testthat/test-import_and_merge_tables.R new file mode 100644 index 0000000000000000000000000000000000000000..abf663e8fbb38a29034a59d327b95aa11107746c --- /dev/null +++ b/tests/testthat/test-import_and_merge_tables.R @@ -0,0 +1,86 @@ +test_that("import_and_merge_tables works", { + + Sys.setenv(user_runner="runner") + Sys.setenv(pwd_runner=Sys.getenv("BDD_RUNNER_PWD")) + + # Créer une table source dans le schéma public de la base collectr + create_dummy(host = "localhost", + database = "collectr", + schema = "public", + table = "source", + pk = "id", + role = "runner") + # Créer une table target dans le schéma public de la base collectr + create_dummy(host = "localhost", + database = "collectr", + schema = "public", + table = "target", + pk = "id", + id_range = "6:10", + role = "runner") + + expect_true(import_and_merge_tables( + host = "localhost", + database = "collectr", + source_table = "source", + source_schema = "public", + target_table = "target", + target_schema = "public", + role = "runner" + )) +}) + +test_that("import_and_merge_tables fails", { + + Sys.setenv(user_runner="runner") + Sys.setenv(pwd_runner=Sys.getenv("BDD_RUNNER_PWD")) + + # Créer une table source dans le schéma public de la base collectr + create_dummy(host = "localhost", + database = "collectr", + schema = "public", + table = "source", + pk = "id", + role = "runner") + # Créer une table target dans le schéma public de la base collectr + create_dummy(host = "localhost", + database = "collectr", + schema = "public", + table = "target", + pk = "id", + id_range = "6:10", + role = "runner") + + expect_error(import_and_merge_tables( + host = "localhost", + database = "collectr", + source_table = "ghost", + source_schema = "public", + target_table = "target", + target_schema = "public", + role = "runner" + ), "La table source sp\u00e9cifi\u00e9e n\'existe pas dans la base de donn\u00e9es.") + + expect_error(import_and_merge_tables( + host = "localhost", + database = "collectr", + source_table = "source", + source_schema = "public", + target_table = "ghost", + target_schema = "public", + role = "runner" + ), "La table cible sp\u00e9cifi\u00e9e n\'existe pas dans la base de donn\u00e9es.") + + skip_on_ci() + mockery::stub(import_and_merge_tables, "datalibaba::connect_to_db", function(...) "InvalidConnection") + + expect_error(import_and_merge_tables( + host = "localhost", + database = "collectr", + source_table = "source", + source_schema = "public", + target_table = "target", + target_schema = "public", + role = "runner" + ), "La connexion fournie n\'est pas une connexion PostgreSQL valide.") +}) diff --git a/vignettes/database-utils.Rmd b/vignettes/database-utils.Rmd index 7f177bff99e42f22fc7d69710f7223be297608db..72bf05552e721ecb62c906ae623f76228b90880a 100644 --- a/vignettes/database-utils.Rmd +++ b/vignettes/database-utils.Rmd @@ -41,11 +41,13 @@ create_schema(host = "localhost", ```{r examples-create_dummy, eval=FALSE} #' \dontrun{ # Création d'une table dummy dans le schéma public de la base collectr -collectr::create_dummy(host = "localhost", - database = "collectr", - schema = "public", - table = "dummy", - role = "runner") +create_dummy(host = "localhost", + database = "collectr", + schema = "public", + table = "dummy", + pk = "id", + id_range = "1:5", + role = "runner") #' } ``` diff --git a/vignettes/write-data.Rmd b/vignettes/write-data.Rmd index fc81166dbe14ae28d7cbde3118c335456d6d8161..3dc8cae0865834d9cc97be434a080b6d38f04219 100644 --- a/vignettes/write-data.Rmd +++ b/vignettes/write-data.Rmd @@ -83,13 +83,29 @@ insert_into_table(database = "si_eau", ```{r examples-import_and_merge_tables, eval=FALSE} #' \dontrun{ +# Créer une table source dans le schéma public de la base collectr +create_dummy(host = "localhost", + database = "collectr", + schema = "public", + table = "source", + pk = "id", + role = "runner") +# Créer une table target dans le schéma public de la base collectr +create_dummy(host = "localhost", + database = "collectr", + schema = "public", + table = "target", + pk = "id", + id_range = "6:10", + role = "runner") # Utilisation de la fonction import_and_merge_tables() -import_and_merge_tables(database = "si_eau", - source_table = "nitrate_data_analyse_ars_2023", - source_schema = "nitrates", - target_table = "nitrate_data_analyse_ars_test", - target_schema = "nitrates", - role = "admin") +import_and_merge_tables(host = "localhost", + database = "collectr", + source_table = "source", + source_schema = "public", + target_table = "target", + target_schema = "public", + role = "runner") #' } ```