Skip to content
Snippets Groups Projects
Commit 24c91681 authored by ronan.vignard's avatar ronan.vignard
Browse files

Merge branch 'dev' into 'master'

Création des tests pour insert_into_table()

See merge request !64
parents de3f5ae4 d853b466
No related branches found
No related tags found
1 merge request!64Création des tests pour insert_into_table()
Pipeline #537587 passed
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#' schema = "public", #' schema = "public",
#' table = "dummy", #' table = "dummy",
#' pk = NULL, #' pk = NULL,
#' id_range = "1:5" #' id_range = "1:5",
#' role = "runner") #' role = "runner")
#' } #' }
create_dummy <- function(host, database, schema, table, pk = NULL, create_dummy <- function(host, database, schema, table, pk = NULL,
......
...@@ -23,14 +23,14 @@ ...@@ -23,14 +23,14 @@
#' @export #' @export
#' @examples #' @examples
#' \dontrun{ #' \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", #' create_dummy(host = "localhost",
#' database = "collectr", #' database = "collectr",
#' schema = "public", #' schema = "public",
#' table = "source", #' table = "source",
#' pk = "id", #' pk = "id",
#' role = "runner") #' 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", #' create_dummy(host = "localhost",
#' database = "collectr", #' database = "collectr",
#' schema = "public", #' schema = "public",
......
#' Insère un dataframe dans une table existante #' Insère un dataframe dans une table existante
#' #'
#' @description Fonction pour insérer les données d'un dataframe dans une table #' @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 #' 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 #' 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 #' 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 #' n'est pas vérifiée les différences de strcture entre le dataframe et la table
#' sont listées. #' sont listées.
#' #'
#' @param host Hôte de la base de données PostgreSQL.
#' @param database Nom de la base de données. #' @param database Nom de la base de données.
#' @param schema Le schéma de la table dans 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 table Le nom de la table existante dans la base de données.
#' @param dataframe Le dataframe contenant les données à insérer. #' @param dataframe Le dataframe contenant les données à insérer.
#' @param role Le rôle du propriétaire de la table. #' @param role Le rôle du propriétaire de la table.
#' #'
#' @return Le nombre de lignes insérées dans la table en base. #' @return Le nombre de lignes insérées dans la table en base.
#' #'
#' @importFrom datalibaba connect_to_db #' @importFrom datalibaba connect_to_db
...@@ -23,54 +24,61 @@ ...@@ -23,54 +24,61 @@
#' @export #' @export
#' @examples #' @examples
#' \dontrun{ #' \dontrun{
#' # Création d'un dataframe à partir d'un fichier XLSX #' # Créer une dataframe source
#' data_ars_2022 <- collectr::import_xlsx( #' source <- data.frame(
#' filepath = "C:\\TEMP\\Nitrates_2022.xlsx", #' id = 6:10,
#' sheet = 1, #' name = c("Alice", "Bob", "Charlie", "David", "Eve"),
#' row = 1) #' birthdate = c("1990-01-15", "1985-06-22", "1992-09-10", "1988-03-05", "1995-12-30"),
#' #' value = rnorm(5)
#' # Ajout d'un champs de géométrie #' )
#' data_ars_2022 <- data_ars_2022 |> #' # Créer une table target dans le schéma public de la base collectr
#' dplyr::select(-coord_x,-coord_y) |> #' create_dummy(host = "localhost",
#' dplyr::mutate(eligible_ades = rep(NA, dplyr::n())) #' database = "collectr",
#' #' schema = "public",
#' table = "target",
#' pk = "id",
#' id_range = "1:5",
#' role = "runner")
#' # Utilisation de la fonction insert_into_table() #' # Utilisation de la fonction insert_into_table()
#' insert_into_table(database = "si_eau", #' insert_into_table(host = "localhost",
#' schema = "nitrates", #' database = "collectr",
#' table = "nitrate_data_analyse_ars_test", #' schema = "public",
#' dataframe = data_ars_2022, #' table = "target",
#' role = "admin") #' 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 # Se connecter à la base de données PostgreSQL
connexion <- datalibaba::connect_to_db(db = database, connexion <- datalibaba::connect_to_db(server = host,
user = role, db = database,
user = role,
ecoSQL = FALSE) ecoSQL = FALSE)
# Vérifier si la table existe dans la base de données # 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.") stop("La table sp\u00e9cifi\u00e9e n\'existe pas dans la base de donn\u00e9es.")
} }
# Vérifier si les attributs correspondent # Vérifier si les attributs correspondent
if (!check_structure_table(database = database, schema = schema, if (!check_structure_table(host = host, database = database, schema = schema,
table = table, dataframe = dataframe, table = table, dataframe = dataframe,
role = role)) { role = role)) {
return(FALSE) return(FALSE)
} }
# Utiliser sqlAppendTable pour préparer la requête d'insertion # Utiliser sqlAppendTable pour préparer la requête d'insertion
insert_query <- DBI::sqlAppendTable(connexion, insert_query <- DBI::sqlAppendTable(connexion,
DBI::Id(schema = schema, table = table), DBI::Id(schema = schema, table = table),
dataframe, dataframe,
row.names = FALSE) row.names = FALSE)
# Exécuter la requête d'insertion # Exécuter la requête d'insertion
result <- DBI::dbExecute(connexion, insert_query) result <- DBI::dbExecute(connexion, insert_query)
# Se déconnecter de la base de données # Se déconnecter de la base de données
DBI::dbDisconnect(connexion) DBI::dbDisconnect(connexion)
# Renvoyer le nombre de lignes insérées # Renvoyer le nombre de lignes insérées
return(result) return(result)
} }
...@@ -87,6 +87,7 @@ usethis::use_r("import_and_merge_tables") ...@@ -87,6 +87,7 @@ usethis::use_r("import_and_merge_tables")
usethis::use_r("import_geopackage") usethis::use_r("import_geopackage")
usethis::use_r("import_shapefile") usethis::use_r("import_shapefile")
usethis::use_r("import_xlsx") usethis::use_r("import_xlsx")
usethis::use_r("insert_into_table")
usethis::use_r("modify_column_type") usethis::use_r("modify_column_type")
usethis::use_r("remove_special_chars") usethis::use_r("remove_special_chars")
usethis::use_r("rename_field") usethis::use_r("rename_field")
...@@ -110,6 +111,7 @@ usethis::use_test("import_and_merge_tables") ...@@ -110,6 +111,7 @@ usethis::use_test("import_and_merge_tables")
usethis::use_test("import_geopackage") usethis::use_test("import_geopackage")
usethis::use_test("import_shapefile") usethis::use_test("import_shapefile")
usethis::use_test("import_xlsx") usethis::use_test("import_xlsx")
usethis::use_test("insert_into_table")
usethis::use_test("modify_column_type") usethis::use_test("modify_column_type")
usethis::use_test("remove_special_chars") usethis::use_test("remove_special_chars")
usethis::use_test("rename_field") usethis::use_test("rename_field")
......
...@@ -36,7 +36,7 @@ create_dummy(host = "localhost", ...@@ -36,7 +36,7 @@ create_dummy(host = "localhost",
schema = "public", schema = "public",
table = "dummy", table = "dummy",
pk = NULL, pk = NULL,
id_range = "1:5" id_range = "1:5",
role = "runner") role = "runner")
} }
} }
...@@ -41,14 +41,14 @@ ou l'autre des tables. ...@@ -41,14 +41,14 @@ ou l'autre des tables.
} }
\examples{ \examples{
\dontrun{ \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", create_dummy(host = "localhost",
database = "collectr", database = "collectr",
schema = "public", schema = "public",
table = "source", table = "source",
pk = "id", pk = "id",
role = "runner") 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", create_dummy(host = "localhost",
database = "collectr", database = "collectr",
schema = "public", schema = "public",
......
...@@ -4,9 +4,11 @@ ...@@ -4,9 +4,11 @@
\alias{insert_into_table} \alias{insert_into_table}
\title{Insère un dataframe dans une table existante} \title{Insère un dataframe dans une table existante}
\usage{ \usage{
insert_into_table(database, schema, table, dataframe, role) insert_into_table(host, database, schema, table, dataframe, role)
} }
\arguments{ \arguments{
\item{host}{Hôte de la base de données PostgreSQL.}
\item{database}{Nom de la base de données.} \item{database}{Nom de la base de données.}
\item{schema}{Le schéma de la table dans 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. ...@@ -30,22 +32,27 @@ sont listées.
} }
\examples{ \examples{
\dontrun{ \dontrun{
# Création d'un dataframe à partir d'un fichier XLSX # Créer une dataframe source
data_ars_2022 <- collectr::import_xlsx( source <- data.frame(
filepath = "C:\\\\TEMP\\\\Nitrates_2022.xlsx", id = 6:10,
sheet = 1, name = c("Alice", "Bob", "Charlie", "David", "Eve"),
row = 1) birthdate = c("1990-01-15", "1985-06-22", "1992-09-10", "1988-03-05", "1995-12-30"),
value = rnorm(5)
# Ajout d'un champs de géométrie )
data_ars_2022 <- data_ars_2022 |> # Créer une table target dans le schéma public de la base collectr
dplyr::select(-coord_x,-coord_y) |> create_dummy(host = "localhost",
dplyr::mutate(eligible_ades = rep(NA, dplyr::n())) database = "collectr",
schema = "public",
table = "target",
pk = "id",
id_range = "1:5",
role = "runner")
# Utilisation de la fonction insert_into_table() # Utilisation de la fonction insert_into_table()
insert_into_table(database = "si_eau", insert_into_table(host = "localhost",
schema = "nitrates", database = "collectr",
table = "nitrate_data_analyse_ars_test", schema = "public",
dataframe = data_ars_2022, table = "target",
role = "admin") dataframe = source,
role = "runner")
} }
} }
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"))
})
...@@ -59,23 +59,28 @@ archive_table(host = "localhost", ...@@ -59,23 +59,28 @@ archive_table(host = "localhost",
```{r examples-insert_into_table, eval=FALSE} ```{r examples-insert_into_table, eval=FALSE}
#' \dontrun{ #' \dontrun{
# Création d'un dataframe à partir d'un fichier XLSX # Créer une dataframe source
data_ars_2022 <- collectr::import_xlsx( source <- data.frame(
filepath = "C:\\TEMP\\Nitrates_2022.xlsx", id = 6:10,
sheet = 1, name = c("Alice", "Bob", "Charlie", "David", "Eve"),
row = 1) birthdate = c("1990-01-15", "1985-06-22", "1992-09-10", "1988-03-05", "1995-12-30"),
value = rnorm(5)
# Ajout d'un champs de géométrie )
data_ars_2022 <- data_ars_2022 |> # Créer une table target dans le schéma public de la base collectr
dplyr::select(-coord_x,-coord_y) |> create_dummy(host = "localhost",
dplyr::mutate(eligible_ades = rep(NA, dplyr::n())) database = "collectr",
schema = "public",
# Utilisation de la fonction insert_into_table() table = "target",
insert_into_table(database = "si_eau", pk = "id",
schema = "nitrates", id_range = "1:5",
table = "nitrate_data_analyse_ars_test", role = "runner")
dataframe = data_ars_2022, # Utilisation de la fonction insert_into_table()
role = "admin") insert_into_table(host = "localhost",
database = "collectr",
schema = "public",
table = "target",
dataframe = source,
role = "runner")
#' } #' }
``` ```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment