From a5ade9b7e7dd67be003e10cc5b8b08e58d1014eb Mon Sep 17 00:00:00 2001 From: Juliette Engelaere-Lefebvre <juliette.engelaere@developpement-durable.gouv.fr> Date: Tue, 14 Jun 2022 12:49:39 +0200 Subject: [PATCH] =?UTF-8?q?bug=5Ffix=20:=20parametrage=20de=20la=20fonctio?= =?UTF-8?q?n=20poster=5Fdata()=20selon=20le=20nom=20de=20la=20colonne=20ge?= =?UTF-8?q?om=C3=A9trique?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DESCRIPTION | 4 ++-- NEWS.md | 6 +++++- R/post_data.R | 28 +++++++++++++++++----------- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 7c0e3b1..2f208d4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: datalibaba -Title: Interface De Connexion a Une Base Posgres -Version: 0.0.0.9000 +Title: Interface De Connexion a Une Base Posgres Postgis +Version: 0.0.0.9001 Authors@R: c(person(given = "Maël", family = "Theulière", diff --git a/NEWS.md b/NEWS.md index 86dc5b0..927e549 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,7 @@ +# datalibaba 0.0.0.9001 +- Correction d'un bug dans la fonction `poster_data()` : paramétrage des contraintes géo selon le nom de la colonne géo. (auparavant utilisation de 'geometry' pour toutes les tables, ce qui provoquait des plantages). +- Ajout de message pour le post de datatset geo afin d'identifier quelle étape est en cours. + # datalibaba 0.0.0.9000 - ajout de la fonction `check_server_renviron()` qui vérifie si les variables système sont bien activées via .Renviron. @@ -8,7 +12,7 @@ - ajout des fonctions `post_data()`, `post_data_dbi()`, `poster_data()` : Versement d'un dataset sur le serveur. - ajout des fonctions `get_data()`, `get_data_dbi()`, `importer_data()` : Import d'un dataset du serveur. - ajout des fonctions `commenter_table()`, `commenter_schema()`, `commenter_champs()` et `post_dico_attr()` : Rédaction de commentaires descriptifs sur les schémas et les tables du serveur de données. -- ajout des fonctions `get_table_comments()` et `transferer_table_comment()` : qui récupérent et transfèrent les commentaires descriptifs d'une table du serveur de données à une autre. +- ajout des fonctions `get_table_comments()` et `transferer_table_comment()` : qui récupèrent et transfèrent les commentaires descriptifs d'une table du serveur de données à une autre. - ajout de la fonction `exporter_table_comments()` qui récupère le descriptif d'une table SGBD (commentaire de table et commentaires de champs) et les exporte dans un tableur csv. - ajout fonction `set_schema_rights()` qui affecte à une table les droits de lecture/écriture de son schéma. diff --git a/R/post_data.R b/R/post_data.R index 6af0c12..34fd1c4 100644 --- a/R/post_data.R +++ b/R/post_data.R @@ -200,10 +200,10 @@ poster_data <- function(data = NULL, paste(noms_r, collapse = ","), "}}") defs2 <- data.frame(table_nm = table, df_def = defs) - suppressMessages({ + suppressWarnings(suppressMessages({ rpostgis::pgInsert(con, c(schema, "zz_r_df_def"), defs2, upsert.using = "table_nm", row.names = FALSE) - }) + })) # precaution d'encodage des variables de type texte ou categorielles--------------- d <- dplyr::mutate(d, dplyr::across(tidyselect::vars_select_helpers$where(is.character), enc2utf8), @@ -223,26 +223,31 @@ poster_data <- function(data = NULL, ## Ecriture de la table : un comportement different pour les donnees spatiales et les autres dataframes------ if( any(grepl("sf", class(d))) ) { - attempt::warn_if(attributes(d)$sf_column != names(d)[ncol(d)], + nom_col_geo <- attributes(d)$sf_column + attempt::warn_if(nom_col_geo != names(d)[ncol(d)], msg = "La colonne geo n'est pas en fin de dataset, c'est une mauvaise pratique.") sf::st_write(obj = d, dsn = con, delete_layer = overwrite, layer = c(schema = schema, table = table)) + message(paste0('Table ', table,' ecrite sur le serveur avec sf::st_write(). ')) # Ajout contrainte forcage crs ouverture couche crs <- sf::st_crs(x = d, parameters = TRUE)$epsg crs <- ifelse(is.null(crs), 2154, crs) - sql_query_crs <- paste0("ALTER TABLE ", schema, ".", table ," ADD CONSTRAINT enforce_srid_geom CHECK (st_srid(geometry) = ", crs, ");") + sql_query_crs <- paste0("ALTER TABLE ", schema, ".", table ," ADD CONSTRAINT enforce_srid_geom CHECK (st_srid(", nom_col_geo, ") = ", crs, ");") DBI::dbExecute(conn = con, sql_query_crs) + message(paste0("Ajout de la contrainte du CRS d'ouverture : ", crs, ".")) # Ajout contrainte nombre de dimension # if(chek_dim) { - dim <- max(unique(sf::st_dimension(d, NA_if_empty = TRUE)), 2, na.rm = TRUE) - sql_query_dim <- paste0("ALTER TABLE ", schema, ".", table ," ADD CONSTRAINT enforce_dims_geom CHECK (st_ndims(geometry) = ", dim, ");") - DBI::dbExecute(conn = con, sql_query_dim) - # } + dim <- max(unique(sf::st_dimension(d, NA_if_empty = TRUE)), 2, na.rm = TRUE) + sql_query_dim <- paste0("ALTER TABLE ", schema, ".", table ," ADD CONSTRAINT enforce_dims_geom CHECK (st_ndims(", nom_col_geo, ") = ", dim, ");") + DBI::dbExecute(conn = con, sql_query_dim) + message(paste0("Ajout de la contrainte du nombre de dimension : ", dim, ".")) + + # } # Ajout index geo nom_champ_geo <- - rpostgis::dbIndex(conn = con, name = c(schema, table), colname = attributes(d)$sf_column, - idxname = paste0("gix_", table), unique = FALSE, method = "gist", - display = FALSE, exec = TRUE) + rpostgis::dbIndex(conn = con, name = c(schema, table), colname = attributes(d)$sf_column, + idxname = paste0("gix_", table), unique = FALSE, method = "gist", + display = FALSE, exec = TRUE) mess <- "spatial " mess2 <- paste0(" - index spatial declar\u00e9 sur '", attributes(d)$sf_column, "'") } else { @@ -276,6 +281,7 @@ poster_data <- function(data = NULL, return(invisible(NULL)) } + # # poster_data(data = ecln_cogifie, table = "test_ecln_cog", schema = "public", db = "public", server = "localhost", # pk = c("TypeZone", "CodeZone", "date"), post_row_name = FALSE, overwrite = TRUE, user = "does") -- GitLab