diff --git a/R/create_dummy.R b/R/create_dummy.R index 1fe3b81a00e5aac4d4335522ba849e6ef5f7cb9f..2284c5123e3c58b7bdc5dc93099adb5b0f444747 100644 --- a/R/create_dummy.R +++ b/R/create_dummy.R @@ -28,7 +28,7 @@ #' schema = "public", #' table = "dummy", #' pk = NULL, -#' id_range = "1:5" +#' id_range = "1:5", #' role = "runner") #' } create_dummy <- function(host, database, schema, table, pk = NULL, diff --git a/R/fix_encoding_variable.R b/R/fix_encoding_variable.R index 6195ea0d8388e3ec61876ab5bbb9493c56d3103d..810026beefcd5a1dcfc5d2ddad3b10166836de87 100644 --- a/R/fix_encoding_variable.R +++ b/R/fix_encoding_variable.R @@ -1,27 +1,29 @@ #' Corrige l'encodage pour une variable spécifiée dans un dataframe #' -#' @description Cette fonction corrige l'encodage des caractères d'une variable +#' @description Cette fonction corrige l'encodage des caractères d'une variable #' spécifiée dans un dataframe de ISO-8859-1 à UTF-8. #' #' @param data Un dataframe contenant les données. -#' @param variable Une chaîne de caractères spécifiant le nom de la +#' @param variable Une chaîne de caractères spécifiant le nom de la #' variable (colonne) dont l'encodage doit être corrigé. #' -#' @return Un dataframe avec l'encodage de la variable spécifiée corrigé en +#' @return Un dataframe avec l'encodage de la variable spécifiée corrigé en #' UTF-8. #' #' @importFrom dplyr mutate -#' +#' #' @export #' @examples #' \dontrun{ #' # Utilisation de la fonction fix_encoding_variable() -#' nitrate_analyse_esu_2023 <- fix_encoding_variable(nitrate_analyse_esu_2023, -#' "libelle_station") -#' -#' # Vérification de l'encodage corrigé -#' head(nitrate_analyse_esu_2023$libelle_station) +#' data_test <- data.frame(id = 1:3, +#' libelle = c("Établissement A", "Forêt B", "Île C"), +#' stringsAsFactors = FALSE) +#' # Simuler un encodage ISO-8859-1 +#'data_test$libelle <- iconv(data_test$libelle, from = "UTF-8", to = "ISO-8859-1") +#' # Correction de l'encodage +#' data_test_corrige <- fix_encoding_variable(data_test, "libelle") #' } fix_encoding_variable <- function(data, variable) { # Vérifier si la variable existe dans le dataframe @@ -31,6 +33,7 @@ fix_encoding_variable <- function(data, variable) { # Utiliser mutate pour corriger l'encodage de la variable spécifiée data |> - dplyr::mutate(variable = iconv(variable, from = "ISO-8859-1", to = "UTF-8")) + dplyr::mutate(!!variable := iconv(.data[[variable]], + from = "ISO-8859-1", to = "UTF-8")) } diff --git a/R/import_and_merge_tables.R b/R/import_and_merge_tables.R index ac35de3940a895337f001649159625dc3eaf7e23..f7133b7fac0d60ae7a42c61699becba3f409e94e 100644 --- a/R/import_and_merge_tables.R +++ b/R/import_and_merge_tables.R @@ -23,14 +23,14 @@ #' @export #' @examples #' \dontrun{ -#' # Créer une table dummy dans le schéma collectr de la base production +#' # 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 dummy dans le schéma collectr de la base production +#' # Créer une table target dans le schéma public de la base collectr #' create_dummy(host = "localhost", #' database = "collectr", #' schema = "public", diff --git a/R/insert_into_table.R b/R/insert_into_table.R index 9083407b12e3c31ffc50fbe737e9fbf3dc22434c..1e3b040fb13f27b378eed2db5bd11cc291227358 100644 --- a/R/insert_into_table.R +++ b/R/insert_into_table.R @@ -1,19 +1,20 @@ #' Insère un dataframe dans une table existante #' -#' @description Fonction pour insérer les données d'un dataframe dans une table -#' existante d'une base de données PostgreSQL, en vérifiant la correspondance -#' de la structure entre le dataframe et la table. Si la correspondance est +#' @description Fonction pour insérer les données d'un dataframe dans une table +#' existante d'une base de données PostgreSQL, en vérifiant la correspondance +#' de la structure entre le dataframe et la table. Si la correspondance est #' vérifiée, les données sont insérées dans la table. Si la correspondance #' n'est pas vérifiée les différences de strcture entre le dataframe et la table #' sont listées. #' +#' @param host Hôte de la base de données PostgreSQL. #' @param database Nom de la base de données. #' @param schema Le schéma de la table dans la base de données. #' @param table Le nom de la table existante dans la base de données. #' @param dataframe Le dataframe contenant les données à insérer. #' @param role Le rôle du propriétaire de la table. -#' +#' #' @return Le nombre de lignes insérées dans la table en base. #' #' @importFrom datalibaba connect_to_db @@ -23,54 +24,61 @@ #' @export #' @examples #' \dontrun{ -#' # Création d'un dataframe à partir d'un fichier XLSX -#' data_ars_2022 <- collectr::import_xlsx( -#' filepath = "C:\\TEMP\\Nitrates_2022.xlsx", -#' sheet = 1, -#' row = 1) -#' -#' # Ajout d'un champs de géométrie -#' data_ars_2022 <- data_ars_2022 |> -#' dplyr::select(-coord_x,-coord_y) |> -#' dplyr::mutate(eligible_ades = rep(NA, dplyr::n())) -#' +#' # Créer une dataframe source +#' source <- data.frame( +#' id = 6:10, +#' 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) +#' ) +#' # 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 = "1:5", +#' role = "runner") #' # Utilisation de la fonction insert_into_table() -#' insert_into_table(database = "si_eau", -#' schema = "nitrates", -#' table = "nitrate_data_analyse_ars_test", -#' dataframe = data_ars_2022, -#' role = "admin") +#' insert_into_table(host = "localhost", +#' database = "collectr", +#' schema = "public", +#' table = "target", +#' dataframe = source, +#' role = "runner") #' } -insert_into_table <- function(database, schema, table, dataframe, role) { +insert_into_table <- function(host, database, schema, table, dataframe, role) { # Se connecter à la base de données PostgreSQL - connexion <- datalibaba::connect_to_db(db = database, - user = role, + connexion <- datalibaba::connect_to_db(server = host, + db = database, + user = role, ecoSQL = FALSE) - + # Vérifier si la table existe dans la base de données - if (!table_exists(database = database, schema = schema, table = table, role = role)) { + if (!table_exists(host = host, database = database, schema = schema, + table = table, role = role)) { stop("La table sp\u00e9cifi\u00e9e n\'existe pas dans la base de donn\u00e9es.") } - # Vérifier si les attributs correspondent - if (!check_structure_table(database = database, schema = schema, - table = table, dataframe = dataframe, + # Vérifier si les attributs correspondent + if (!check_structure_table(host = host, database = database, schema = schema, + table = table, dataframe = dataframe, role = role)) { return(FALSE) } # Utiliser sqlAppendTable pour préparer la requête d'insertion insert_query <- DBI::sqlAppendTable(connexion, - DBI::Id(schema = schema, table = table), - dataframe, - row.names = FALSE) + DBI::Id(schema = schema, table = table), + dataframe, + row.names = FALSE) # Exécuter la requête d'insertion result <- DBI::dbExecute(connexion, insert_query) # Se déconnecter de la base de données DBI::dbDisconnect(connexion) - + # Renvoyer le nombre de lignes insérées return(result) } diff --git a/dev/0-dev_history.Rmd b/dev/0-dev_history.Rmd index 9309763eb6a8369ff7c574f25bdefd434e024582..d87a597ccf883275ddbcb57d4289d6ab7ccb5318 100644 --- a/dev/0-dev_history.Rmd +++ b/dev/0-dev_history.Rmd @@ -80,6 +80,7 @@ usethis::use_r("close_all_connections") usethis::use_r("create_dummy") usethis::use_r("create_schema") usethis::use_r("download_and_extract_wfs") +usethis::use_r("fix_encoding_variable") usethis::use_r("format_colnames") usethis::use_r("format_filepath") usethis::use_r("get_variable_completion_rate") @@ -87,6 +88,7 @@ usethis::use_r("import_and_merge_tables") usethis::use_r("import_geopackage") usethis::use_r("import_shapefile") usethis::use_r("import_xlsx") +usethis::use_r("insert_into_table") usethis::use_r("modify_column_type") usethis::use_r("remove_special_chars") usethis::use_r("rename_field") @@ -103,6 +105,7 @@ usethis::use_test("close_all_connections") usethis::use_test("create_dummy") usethis::use_test("create_schema") usethis::use_test("download_and_extract_wfs") +usethis::use_test("fix_encoding_variable") usethis::use_test("format_colnames") usethis::use_test("format_filepath") usethis::use_test("get_variable_completion_rate") @@ -110,6 +113,7 @@ usethis::use_test("import_and_merge_tables") usethis::use_test("import_geopackage") usethis::use_test("import_shapefile") usethis::use_test("import_xlsx") +usethis::use_test("insert_into_table") usethis::use_test("modify_column_type") usethis::use_test("remove_special_chars") usethis::use_test("rename_field") diff --git a/man/create_dummy.Rd b/man/create_dummy.Rd index 0fb84ed23786d3895f9e0eb25d303cb79b4fd0c4..c9d0d8d2fb4ddb90a559fdadbe7d7ead9460588c 100644 --- a/man/create_dummy.Rd +++ b/man/create_dummy.Rd @@ -36,7 +36,7 @@ create_dummy(host = "localhost", schema = "public", table = "dummy", pk = NULL, - id_range = "1:5" + id_range = "1:5", role = "runner") } } diff --git a/man/fix_encoding_variable.Rd b/man/fix_encoding_variable.Rd index c0cf7def3bd8a14bda9a013a61a972f9482d96e3..9179a5a1c11e332da96670b4518245f9d4b89c05 100644 --- a/man/fix_encoding_variable.Rd +++ b/man/fix_encoding_variable.Rd @@ -23,10 +23,12 @@ spécifiée dans un dataframe de ISO-8859-1 à UTF-8. \examples{ \dontrun{ # Utilisation de la fonction fix_encoding_variable() -nitrate_analyse_esu_2023 <- fix_encoding_variable(nitrate_analyse_esu_2023, - "libelle_station") - -# Vérification de l'encodage corrigé -head(nitrate_analyse_esu_2023$libelle_station) +data_test <- data.frame(id = 1:3, + libelle = c("Établissement A", "Forêt B", "Île C"), + stringsAsFactors = FALSE) +# Simuler un encodage ISO-8859-1 +data_test$libelle <- iconv(data_test$libelle, from = "UTF-8", to = "ISO-8859-1") +# Correction de l'encodage +data_test_corrige <- fix_encoding_variable(data_test, "libelle") } } diff --git a/man/import_and_merge_tables.Rd b/man/import_and_merge_tables.Rd index 274bad8e5797a08cca18c463f2d981b459bcd522..36abe6c58f75e08342f0f7b772fa5c155122a412 100644 --- a/man/import_and_merge_tables.Rd +++ b/man/import_and_merge_tables.Rd @@ -41,14 +41,14 @@ ou l'autre des tables. } \examples{ \dontrun{ -# Créer une table dummy dans le schéma collectr de la base production +# 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 dummy dans le schéma collectr de la base production +# Créer une table target dans le schéma public de la base collectr create_dummy(host = "localhost", database = "collectr", schema = "public", diff --git a/man/insert_into_table.Rd b/man/insert_into_table.Rd index 1a1e7b1229af9fd862d0f8553dccc380c831f92a..9237157076b45e34201277af3970988a55bccb43 100644 --- a/man/insert_into_table.Rd +++ b/man/insert_into_table.Rd @@ -4,9 +4,11 @@ \alias{insert_into_table} \title{Insère un dataframe dans une table existante} \usage{ -insert_into_table(database, schema, table, dataframe, role) +insert_into_table(host, database, schema, table, dataframe, role) } \arguments{ +\item{host}{Hôte de la base de données PostgreSQL.} + \item{database}{Nom de la base de données.} \item{schema}{Le schéma de la table dans la base de données.} @@ -30,22 +32,27 @@ sont listées. } \examples{ \dontrun{ -# Création d'un dataframe à partir d'un fichier XLSX -data_ars_2022 <- collectr::import_xlsx( - filepath = "C:\\\\TEMP\\\\Nitrates_2022.xlsx", - sheet = 1, - row = 1) - -# Ajout d'un champs de géométrie -data_ars_2022 <- data_ars_2022 |> - dplyr::select(-coord_x,-coord_y) |> - dplyr::mutate(eligible_ades = rep(NA, dplyr::n())) - +# Créer une dataframe source +source <- data.frame( + id = 6:10, + 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) +) +# 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 = "1:5", + role = "runner") # Utilisation de la fonction insert_into_table() -insert_into_table(database = "si_eau", - schema = "nitrates", - table = "nitrate_data_analyse_ars_test", - dataframe = data_ars_2022, - role = "admin") +insert_into_table(host = "localhost", + database = "collectr", + schema = "public", + table = "target", + dataframe = source, + role = "runner") } } diff --git a/tests/testthat/test-fix_encoding_variable.R b/tests/testthat/test-fix_encoding_variable.R new file mode 100644 index 0000000000000000000000000000000000000000..76bb740e609b580d0630fa2427fa6ec39e4ada1c --- /dev/null +++ b/tests/testthat/test-fix_encoding_variable.R @@ -0,0 +1,31 @@ +test_that("fix_encoding_variable works", { + # Création d'un dataframe d'exemple avec encodage ISO-8859-1 + data_test <- data.frame( + id = 1:3, + libelle = c("Établissement A", "Forêt B", "Île C"), + stringsAsFactors = FALSE + ) + + # Simuler un encodage ISO-8859-1 + data_test$libelle <- iconv(data_test$libelle, from = "UTF-8", to = "ISO-8859-1") + + # Vérification avant correction + # expect_true(all(Encoding(data_test$libelle) == "latin1")) + + # Application de la correction + data_test_corrige <- fix_encoding_variable(data_test, "libelle") + + # Vérification après correction + expect_true(all(Encoding(data_test_corrige$libelle) == "UTF-8")) + + # Vérification du contenu inchangé + expect_equal(data_test_corrige$libelle, c("Établissement A", "Forêt B", "Île C")) +}) + +test_that("fix_encoding_variable fails", { + data_test <- data.frame(id = 1:3, nom = c("A", "B", "C")) + + # Vérifie que la fonction renvoie une erreur + expect_error(fix_encoding_variable(data_test, "libelle"), + "La variable libelle n'existe pas dans le dataframe.") +}) diff --git a/tests/testthat/test-insert_into_table.R b/tests/testthat/test-insert_into_table.R new file mode 100644 index 0000000000000000000000000000000000000000..43f037ca92976d51f71e5372d734dffbe8dc8cff --- /dev/null +++ b/tests/testthat/test-insert_into_table.R @@ -0,0 +1,47 @@ +test_that("insert_into_table works", { + + Sys.setenv(user_runner="runner") + Sys.setenv(pwd_runner=Sys.getenv("BDD_RUNNER_PWD")) + + # Création d'un dataframe fictif + source <- data.frame( + id = 6:10, + 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) + ) + # 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 = "1:5", + role = "runner") + + expect_equal(object = insert_into_table(host = "localhost", database = "collectr", + schema = "public", table = "target", + dataframe = source, role = "runner"), + expected = 5) + + expect_error(object = insert_into_table(host = "localhost", database = "collectr", + schema = "public", table = "ghost", + dataframe = source, role = "runner"), + regexp = "La table sp\u00e9cifi\u00e9e n\'existe pas dans la base de donn\u00e9es.") + + # Création d'un dataframe avec une structure différente de la table + df <- data.frame(id = 1:5, name = letters[1:5], value = rnorm(5)) + + # 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 = "1:5", + role = "runner") + + expect_false(insert_into_table(host = "localhost", database = "collectr", + schema = "public", table = "target", + dataframe = df, role = "runner")) +}) diff --git a/vignettes/write-data.Rmd b/vignettes/write-data.Rmd index 3dc8cae0865834d9cc97be434a080b6d38f04219..bc38cf7890035344d4d112b61f29ddd7ea63abf7 100644 --- a/vignettes/write-data.Rmd +++ b/vignettes/write-data.Rmd @@ -59,23 +59,28 @@ archive_table(host = "localhost", ```{r examples-insert_into_table, eval=FALSE} #' \dontrun{ -# Création d'un dataframe à partir d'un fichier XLSX -data_ars_2022 <- collectr::import_xlsx( - filepath = "C:\\TEMP\\Nitrates_2022.xlsx", - sheet = 1, - row = 1) - -# Ajout d'un champs de géométrie -data_ars_2022 <- data_ars_2022 |> - dplyr::select(-coord_x,-coord_y) |> - dplyr::mutate(eligible_ades = rep(NA, dplyr::n())) - -# Utilisation de la fonction insert_into_table() -insert_into_table(database = "si_eau", - schema = "nitrates", - table = "nitrate_data_analyse_ars_test", - dataframe = data_ars_2022, - role = "admin") +# Créer une dataframe source + source <- data.frame( + id = 6:10, + 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) + ) + # 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 = "1:5", + role = "runner") + # Utilisation de la fonction insert_into_table() + insert_into_table(host = "localhost", + database = "collectr", + schema = "public", + table = "target", + dataframe = source, + role = "runner") #' } ```