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/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..fdccdc381e679628c4291c0b7caf2bb17de8b2be 100644 --- a/dev/0-dev_history.Rmd +++ b/dev/0-dev_history.Rmd @@ -87,6 +87,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") @@ -110,6 +111,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/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-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") #' } ```