diff --git a/DESCRIPTION b/DESCRIPTION index 829f60755c7fd94355e0b40f915174bde1ab61f9..10d72c987e03bd7e5a4264db549e9afc14f95fea 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: datalibaba Title: Interface De Connexion a Une Base Posgres Postgis -Version: 0.0.0.9006 +Version: 0.0.0.9007 Authors@R: c(person(given = "Maël", family = "Theulière", diff --git a/NEWS.md b/NEWS.md index 54acdbc21b3f898111acfc7a4a9a3346c9ed8579..2986b0b35500bcdba9190b1dca43d58caf5095cd 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,3 +1,6 @@ +# datalibaba 0.0.0.9007 +- Ajout d'un paramètre `limit` à `importer_data()` pour limiter le nombre d'enregistrement à rapatrier + # datalibaba 0.0.0.9006 - Ajout de la fonction `get_db_comment()` pour récupérer le descriptif d'une base diff --git a/R/get_data.R b/R/get_data.R index efc2590916481c8286861a86ac32e3e401942833..73478b68007bcf9f5c3f8b570de19d3fbd5bc935 100644 --- a/R/get_data.R +++ b/R/get_data.R @@ -1,52 +1,3 @@ -#' Import d'un dataset du serveur -#' -#' @param con Le connecteur de classe PosgreSQLConnection. -#' @param schema Le nom du schema sur le serveur de données. -#' @param table Le nom de la table sur le serveur de données. -#' -#' @importFrom attempt stop_if -#' @importFrom DBI dbReadTable -#' @importFrom RPostgreSQL postgresqlpqExec -#' @return Un dataframe. -#' @export - -get_data <- function(con = NULL, - schema = NULL, - table = NULL) { - attempt::stop_if(con, is.null, msg = "con n'est pas renseign\u00e9") - attempt::stop_if(schema, is.null, msg = "schema n'est pas renseign\u00e9") - attempt::stop_if(table, is.null, msg = "table n'est pas renseign\u00e9") - - data <- DBI::dbReadTable(con, c(schema,table)) - return(data) -} - - - - -#' import d'un dataset du serveur -#' -#' @param con Le connecteur de classe PosgreSQLConnection. -#' @param schema Le nom du schema sur le serveur de données. -#' @param table Le nom de la table sur le serveur de données. -#' @importFrom attempt stop_if -#' @importFrom DBI dbSendQuery dbReadTable Id -#' -#' @return un dataframe -#' @export - -get_data_dbi <- function(con = NULL, - schema = NULL, - table = NULL) { - attempt::stop_if(con, is.null, msg = "con n'est pas renseign\u00e9") - attempt::stop_if(schema, is.null, msg = "schema n'est pas renseign\u00e9") - attempt::stop_if(table, is.null, msg = "table n'est pas renseign\u00e9") - tbl <- DBI::Id(schema = schema, table = table) - data <- DBI::dbReadTable(con, tbl) - return(data) -} - - #' Import d'une table a partir du serveur de donnees, fonction qui s'adapte aux types de table a charger : recuperation des modalites des facteurs si chargee avec {rpostgis}, sf dataframe si table geographique. #' #' @param table Le nom de la table presente sur le serveur de données. @@ -54,6 +5,7 @@ get_data_dbi <- function(con = NULL, #' @param db Le nom de la base de donnees sur laquelle se connecter. #' @param user L'identifiant de l'utilisateur qui se connecte. #' @param server l'adresse ip du serveur, laisser à NULL pour utiliser le variable d'environnement du .Renviron +#' @param limit Le nombre d'enregistrements a rapatrier, 0 pour lire toute la table. #' #' @return la table de donnees, au format dataframe ou sf dataframe si une colonne de type 'USER-DEFINED' est presente dans la table sgbd #' @importFrom attempt stop_if stop_if_not @@ -73,14 +25,16 @@ get_data_dbi <- function(con = NULL, #' @source {rpostgis} http://mablab.org/rpostgis/ -importer_data <- function(table = NULL, schema = NULL, db = "public", server = NULL, user = "does") { +importer_data <- function(table = NULL, schema = NULL, db = "public", server = NULL, user = "does", limit = 0) { attempt::stop_if(table, is.null, msg = "l'argument table n'est pas renseign\u00e9") attempt::stop_if(schema, is.null, msg = "l'argument schema n'est pas renseign\u00e9") attempt::stop_if(db, is.null, msg = "l'argument db n'est pas renseign\u00e9") attempt::stop_if(user, is.null, msg = "l'argument user n'est pas renseign\u00e9") + attempt::stop_if_not(limit, is.numeric, msg = "l'argument user n'est pas num\u00e9rique") con <- connect_to_db(db = db, user = user, server = server) name <- c(schema, table) + query_sql_limit <- paste0("SELECT * FROM ", schema, ".", table, " LIMIT ", limit) attempt::stop_if_not(DBI::dbExistsTable(conn = con, name = name), msg = paste0("La table '", paste(name, collapse = "'.'"), "' est introuvable.")) @@ -109,7 +63,12 @@ importer_data <- function(table = NULL, schema = NULL, db = "public", server = # on distingue 2 cas : table geo, table de donnees if(any(grepl("USER-DEFINED", champs$data_type))) { # la signature des champs de geometry - data_sf <- sf::st_read(dsn = con, layer = c(schema, table)) + if(limit == 0) { + data_sf <- sf::st_read(dsn = con, layer = c(schema, table)) + } else { + data_sf <- sf::st_read(dsn = con, query = query_sql_limit) + } + if ("id_row__" %in% champs$column_name) { # on enleve le champ de cle primaire eventuellement cree après avoir remis dans l'ordre les enregistrements data_sf <- dplyr::arrange(.data = data_sf, .data$id_row__) %>% @@ -118,7 +77,13 @@ importer_data <- function(table = NULL, schema = NULL, db = "public", server = data <- sf::st_drop_geometry(data_sf) } else { - data <- DBI::dbReadTable(con, c(schema, table)) + # table classic (non géo) + if(limit == 0) { + data <- DBI::dbReadTable(con, c(schema, table)) + } else { + data <- DBI::dbGetQuery(con, query_sql_limit) + } + if ("id_row__" %in% champs$column_name) { data <- dplyr::arrange(.data = data, .data$id_row__) %>% @@ -158,7 +123,7 @@ importer_data <- function(table = NULL, schema = NULL, db = "public", server = ## handle POSIX time zones if (att$defs %in% c("POSIXct", "POSIXt")) { data[, i] <- list(eval(parse(text = paste0("as.", att$defs, "(as.character(data[,i]), tz='", - Sys.timezone(), "')")))) + Sys.timezone(), "')")))) ## assign R tz eval(parse(text = paste0("attributes(data$", i, ")$tzone <- att$atts"))) @@ -189,7 +154,7 @@ importer_data <- function(table = NULL, schema = NULL, db = "public", server = data <- data_sf } -# renommer avec les éventuels noms initiaux + # renommer avec les éventuels noms initiaux if(nrow(def_table) > 0) { data <- dplyr::relocate(data, dplyr::all_of(defs$nms)) names(data) <- defs$r_nms @@ -200,6 +165,7 @@ importer_data <- function(table = NULL, schema = NULL, db = "public", server = return(data) } +# Test # ecln_cogifie2 <- importer_data(table = "test_ecln_cog", schema = "public", db = "public", server = "localhost", user = "does") # iris2 <- importer_data(table = "test_iris", schema = "public", db = "public", server = "localhost", user = "does") # pk = NULL, post_row_name = TRUE, overwrite = TRUE # all(iris == iris2) @@ -207,3 +173,56 @@ importer_data <- function(table = NULL, schema = NULL, db = "public", server = # test_epci <- COGiter::epci %>% dplyr::select(-ends_with("DE_L_EPCI")) %>% dplyr::slice(1:270) %>% dplyr::mutate_if(is.factor, forcats::fct_drop) # epci_test <- importer_data(table = "test_epci", schema = "public", db = "datamart", user = "does") # all(epci_test == test_epci) + + + +# Fonctions depreciées + +#' Import d'un dataset du serveur +#' +#' @param con Le connecteur de classe PosgreSQLConnection. +#' @param schema Le nom du schema sur le serveur de données. +#' @param table Le nom de la table sur le serveur de données. +#' +#' @importFrom attempt stop_if +#' @importFrom DBI dbReadTable +#' @importFrom RPostgreSQL postgresqlpqExec +#' @return Un dataframe. +#' @export + +get_data <- function(con = NULL, + schema = NULL, + table = NULL) { + attempt::stop_if(con, is.null, msg = "con n'est pas renseign\u00e9") + attempt::stop_if(schema, is.null, msg = "schema n'est pas renseign\u00e9") + attempt::stop_if(table, is.null, msg = "table n'est pas renseign\u00e9") + + data <- DBI::dbReadTable(con, c(schema,table)) + return(data) +} + + + + +#' import d'un dataset du serveur +#' +#' @param con Le connecteur de classe PosgreSQLConnection. +#' @param schema Le nom du schema sur le serveur de données. +#' @param table Le nom de la table sur le serveur de données. +#' @importFrom attempt stop_if +#' @importFrom DBI dbSendQuery dbReadTable Id +#' +#' @return un dataframe +#' @export + +get_data_dbi <- function(con = NULL, + schema = NULL, + table = NULL) { + attempt::stop_if(con, is.null, msg = "con n'est pas renseign\u00e9") + attempt::stop_if(schema, is.null, msg = "schema n'est pas renseign\u00e9") + attempt::stop_if(table, is.null, msg = "table n'est pas renseign\u00e9") + tbl <- DBI::Id(schema = schema, table = table) + data <- DBI::dbReadTable(con, tbl) + return(data) +} + diff --git a/R/post_data.R b/R/post_data.R index 26d4c3390afe111313f2d4e544aab9fa8dc61a79..3562b38a99d29f72d62db796dd72a5746bb4e199 100644 --- a/R/post_data.R +++ b/R/post_data.R @@ -1,72 +1,3 @@ -#' Chargement d'un dataset sur le serveur -#' -#' @return La fonction charge le dataset sur le serveur. -#' -#' @param con Le connecteur de classe PosgreSQLConnection. -#' @param data Un dataframe a importer. -#' @param schema Le nom du schema sur le serveur de données. -#' @param table Le nom de la table sur le serveur de données. -#' @param overwrite TRUE si on veut ecraser le fichier deja present. -#' -#' @importFrom attempt stop_if stop_if_not message_if -#' @importFrom DBI dbWriteTable -#' @importFrom glue glue -#' @export - -post_data <- function(con, - data = NULL, - schema = NULL, - table = NULL, - overwrite = FALSE - ) { - attempt::stop_if(con, is.null, msg = "con n\'est pas renseign\u00e9") - attempt::stop_if_not(deparse(substitute(con)), exists, msg = glue::glue("le connecteur {con} n\'existe pas")) - attempt::stop_if(data, is.null, msg = "data n\'est pas renseign\u00e9") - attempt::stop_if_not(data, is.data.frame, msg = glue::glue("le dataframe {data} n\'exsiste pas")) - attempt::stop_if(schema, is.null, msg = "schema n\'est pas renseign\u00e9") - attempt::stop_if(table, is.null, msg = "table n\'est pas renseign\u00e9") - attempt::stop_if_not(schema, ~ .x %in% list_schemas(con), msg = glue::glue("le schema {schema} n\'existe pas")) - attempt::stop_if(table %in% list_tables(con,schema) & !overwrite, msg = glue::glue("La table {table} existe d\u00e9j\u00e0 sur le schema {schema} et le param\u00e8 tre overwrite est \u00e0 FALSE")) - attempt::message_if(table %in% list_tables(con,schema) & overwrite, msg = glue::glue("La table {table} est \u00e9cras\u00e9e sur le schema {schema}")) - DBI::dbWriteTable(con, c(schema,table), data, overwrite = overwrite ) - return(invisible(NULL)) -} - - -#' Chargement d'un dataset sur le serveur en dbi -#' -#' @param con Le connecteur de classe PosgreSQLConnection. -#' @param data Un dataframe a importer. -#' @param schema Le nom du schema sur le serveur de donnees. -#' @param table Le nom de la table sur le serveur de donnees. -#' @param overwrite TRUE si on veut ecraser le fichier deja present. -#' @importFrom attempt stop_if stop_if_not -#' @importFrom DBI dbWriteTable Id dbSendQuery -#' @importFrom glue glue -#' -#' @return NULL, la fonction lance le chargement du dataset present dans l'environnement R et son ecriture sur le serveur -#' @export -#' - -post_data_dbi <- function(con = NULL, - data = NULL, - schema = NULL, - table = NULL, - overwrite = FALSE) { - attempt::stop_if(con, is.null, msg = "con n\'est pas renseign\u00e9") - attempt::stop_if_not(deparse(substitute(con)), exists, msg = glue::glue("le connecteur {con} n\'existe pas")) - attempt::stop_if(data, is.null, msg = "data n\'est pas renseign\u00e9") - attempt::stop_if_not(data, is.data.frame, msg = glue::glue("le dataframe {data} n\'exsiste pas")) - attempt::stop_if(schema, is.null, msg = "schema n\'est pas renseign\u00e9") - attempt::stop_if(table, is.null, msg = "table n\'est pas renseign\u00e9") - attempt::stop_if_not(schema, ~ .x %in% list_schemas(con), msg = glue::glue("le schema {schema} n\'existe pas")) - attempt::stop_if(table %in% list_tables(con,schema) & !overwrite, msg = glue::glue("La table {table} existe d\u00e9j\u00e0 sur le schema {schema} et le param\u00e8 tre overwrite est \u00e0 FALSE")) - tbl <- DBI::Id(schema = schema, table = table) - DBI::dbWriteTable(con, tbl, data, overwrite = overwrite ) - return(invisible(NULL)) - -} - #' Chargement d'un dataset sur le serveur avec rpostgis. Par rapport aux autres fonctions `post_data()`, `post_data_pg()` ouvre et ferme la connexion au SGBD, gere les dataframes spatiaux et les facteurs, et poste quelques metadonnees en commentaire de la table. #' #' @param data Un dataframe a verser sur le serveur de donnees. @@ -293,3 +224,75 @@ poster_data <- function(data = NULL, # poster_data(data = COGiter::epci %>% dplyr::select(-ends_with("DE_L_EPCI")) %>% dplyr::slice(1:270) %>% dplyr::mutate_if(is.factor, forcats::fct_drop), # table = "test_epci", schema = "public", # db = "datamart", pk = "EPCI", post_row_name = FALSE, overwrite = TRUE, user = "does") + + + +# Fonction dépréciées---------- +#' Chargement d'un dataset sur le serveur +#' +#' @return La fonction charge le dataset sur le serveur. +#' +#' @param con Le connecteur de classe PosgreSQLConnection. +#' @param data Un dataframe a importer. +#' @param schema Le nom du schema sur le serveur de données. +#' @param table Le nom de la table sur le serveur de données. +#' @param overwrite TRUE si on veut ecraser le fichier deja present. +#' +#' @importFrom attempt stop_if stop_if_not message_if +#' @importFrom DBI dbWriteTable +#' @importFrom glue glue +#' @export + +post_data <- function(con, + data = NULL, + schema = NULL, + table = NULL, + overwrite = FALSE +) { + attempt::stop_if(con, is.null, msg = "con n\'est pas renseign\u00e9") + attempt::stop_if_not(deparse(substitute(con)), exists, msg = glue::glue("le connecteur {con} n\'existe pas")) + attempt::stop_if(data, is.null, msg = "data n\'est pas renseign\u00e9") + attempt::stop_if_not(data, is.data.frame, msg = glue::glue("le dataframe {data} n\'exsiste pas")) + attempt::stop_if(schema, is.null, msg = "schema n\'est pas renseign\u00e9") + attempt::stop_if(table, is.null, msg = "table n\'est pas renseign\u00e9") + attempt::stop_if_not(schema, ~ .x %in% list_schemas(con), msg = glue::glue("le schema {schema} n\'existe pas")) + attempt::stop_if(table %in% list_tables(con,schema) & !overwrite, msg = glue::glue("La table {table} existe d\u00e9j\u00e0 sur le schema {schema} et le param\u00e8 tre overwrite est \u00e0 FALSE")) + attempt::message_if(table %in% list_tables(con,schema) & overwrite, msg = glue::glue("La table {table} est \u00e9cras\u00e9e sur le schema {schema}")) + DBI::dbWriteTable(con, c(schema,table), data, overwrite = overwrite ) + return(invisible(NULL)) +} + + +#' Chargement d'un dataset sur le serveur en dbi +#' +#' @param con Le connecteur de classe PosgreSQLConnection. +#' @param data Un dataframe a importer. +#' @param schema Le nom du schema sur le serveur de donnees. +#' @param table Le nom de la table sur le serveur de donnees. +#' @param overwrite TRUE si on veut ecraser le fichier deja present. +#' @importFrom attempt stop_if stop_if_not +#' @importFrom DBI dbWriteTable Id dbSendQuery +#' @importFrom glue glue +#' +#' @return NULL, la fonction lance le chargement du dataset present dans l'environnement R et son ecriture sur le serveur +#' @export +#' + +post_data_dbi <- function(con = NULL, + data = NULL, + schema = NULL, + table = NULL, + overwrite = FALSE) { + attempt::stop_if(con, is.null, msg = "con n\'est pas renseign\u00e9") + attempt::stop_if_not(deparse(substitute(con)), exists, msg = glue::glue("le connecteur {con} n\'existe pas")) + attempt::stop_if(data, is.null, msg = "data n\'est pas renseign\u00e9") + attempt::stop_if_not(data, is.data.frame, msg = glue::glue("le dataframe {data} n\'exsiste pas")) + attempt::stop_if(schema, is.null, msg = "schema n\'est pas renseign\u00e9") + attempt::stop_if(table, is.null, msg = "table n\'est pas renseign\u00e9") + attempt::stop_if_not(schema, ~ .x %in% list_schemas(con), msg = glue::glue("le schema {schema} n\'existe pas")) + attempt::stop_if(table %in% list_tables(con,schema) & !overwrite, msg = glue::glue("La table {table} existe d\u00e9j\u00e0 sur le schema {schema} et le param\u00e8 tre overwrite est \u00e0 FALSE")) + tbl <- DBI::Id(schema = schema, table = table) + DBI::dbWriteTable(con, tbl, data, overwrite = overwrite ) + return(invisible(NULL)) + +} diff --git a/man/importer_data.Rd b/man/importer_data.Rd index ef7776eb94a77d2924d05ce07a049f60928fcccf..00867d18921500167f8f86520cb809c8c3f2b2f2 100644 --- a/man/importer_data.Rd +++ b/man/importer_data.Rd @@ -12,7 +12,8 @@ importer_data( schema = NULL, db = "public", server = NULL, - user = "does" + user = "does", + limit = 0 ) } \arguments{ @@ -25,6 +26,8 @@ importer_data( \item{server}{l'adresse ip du serveur, laisser à NULL pour utiliser le variable d'environnement du .Renviron} \item{user}{L'identifiant de l'utilisateur qui se connecte.} + +\item{limit}{Le nombre d'enregistrements a rapatrier, 0 pour lire toute la table.} } \value{ la table de donnees, au format dataframe ou sf dataframe si une colonne de type 'USER-DEFINED' est presente dans la table sgbd