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

Ajout du paramètre host et modification de l'exemple pour import_and_merge_tables()

parent f668a4fb
No related branches found
No related tags found
5 merge requests!67Passage en version 0.1.6,!66Intégration de la fonction download_files_from_list(),!65Correction d'un bug + création des tests pour fix_encoding_variable(),!64Création des tests pour insert_into_table(),!63Ajout des tests pour import_and_merge_tables() + adaptation de create_dummy()
#' 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)
}
......@@ -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")
}
}
......@@ -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")
#' }
```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment