Skip to content
Snippets Groups Projects
Commit 77b33a60 authored by Juliette Engelaere-Lefebvre's avatar Juliette Engelaere-Lefebvre
Browse files

Merge branch '26-importer_data-lire-100-premieres-lignes' into 'master'

Resolve "Ajouter un parametre à importer_data pour ne lire que les 100 premières lignes"

Closes #26

See merge request !8
parents 21c190e4 cc43b023
No related branches found
No related tags found
1 merge request!8Resolve "Ajouter un parametre à importer_data pour ne lire que les 100 premières lignes"
Pipeline #377523 passed
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",
......
# 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
......
#' 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)
}
#' 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))
}
......@@ -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
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment