Installer une extension duckdb dans R à travers un proxy
The snippet can be accessed without any authentication.
Authored by
Nicolas.Chuche
duckdb permet de charger des extensions . la liste complète
En temps normal, installer une extension se fait depuis duckdb avec la commande INSTALL
: INSTALL fts
mais cette commande ne fonctionne pas derrière un proxy pour le moment.
Cette fonction permet d'installer les extensions sur une machine linux ou windows, elle s'appuie sur les packages glue
du tidyverse et sur R.utils
pour dégzipper l'extension.
> dl_duckdb_extension("fts")
essai de l'URL 'http://extensions.duckdb.org/v0.9.1/windows_amd64_rtools/fts.duckdb_extension.gz'
Content type 'binary/octet-stream' length 9701009 bytes (9.3 MB)
downloaded 9.3 MB
extension fts installée dans C:/Users/nicolas.chuche/AppData/Roaming/R/data/R/duckdb/.duckdb/extensions/v0.9.1/windows_amd64_rtools/fts.duckdb_extension
Vous pouvez voir la liste des extensions officielles existantes et installées dans la pseudo-table duckdb_extensions()
:
> con <- dbConnect(duckdb())
> dbGetQuery(con, "SELECT * FROM duckdb_extensions();")
extension_name loaded installed install_path description aliases
1 arrow FALSE FALSE A zero-copy data integration between Apache Arrow and DuckDB
2 autocomplete FALSE FALSE Adds support for autocomplete in the shell
3 aws FALSE FALSE Provides features that depend on the AWS SDK
[...]
Et pour charger l'extension il suffit de lancer LOAD fts
:
> dbSendQuery(con, "LOAD fts;")
<duckdb_result f4dc0 connection=6cd10 statement='LOAD fts;'>
#' télécharge une extension duckdb
#'
#' Cette fonction télécharge une extension duckdb et l'installe dans le bon répertoire dans une environnement linux
#' La liste des extensions est disponible ici : https://duckdb.org/docs/extensions/official_extensions
#'
#' Les extensions étant liées à une version de duckdb, vous devrez les réinstaller à chaque mise à jour
#'
#' Vous pouvez voir la liste des extensions officielles existantes et installées en faisant :
#'
#' con <- dbConnect(duckdb())
#' dbGetQuery(con, "SELECT * FROM duckdb_extensions();")
#'
#' @param extension_name le nom de l'extension à télécharger
#'
#' @examples
#' dl_duckdb_extension("fts")
#'
dl_duckdb_extension <- function(extension_name) {
duckdb_version <- stringr::str_extract(as.character(packageVersion('duckdb')), "\\d+\\.\\d+\\.\\d+")
if (extension_name %in% c('sqlite', 'postgres', 'mysql')) {
extension_name <- paste0(extension_name, '_scanner')
}
if (Sys.info()["sysname"] == "Linux") {
url <- glue::glue("http://extensions.duckdb.org/v{duckdb_version}/linux_amd64/{extension_name}.duckdb_extension.gz")
dest_file <- fs::path_home(glue::glue("/.local/share/R/duckdb/extensions/v{duckdb_version}/linux_amd64/{extension_name}.duckdb_extension"))
} else if (Sys.info()["sysname"] == "Windows") {
url <- glue::glue("http://extensions.duckdb.org/v{duckdb_version}/windows_amd64_rtools/{extension_name}.duckdb_extension.gz")
dest_file <- fs::path_home(glue::glue("/AppData/Roaming/R/data/R/duckdb/extensions/v{duckdb_version}/windows_amd64_rtools/{extension_name}.duckdb_extension"))
} else {
stop("Cette fonction ne fonctionne que sur windows et linux")
}
if (file.exists(dest_file)) {
message(glue::glue("extension {extension_name} déjà installée"))
return(invisible())
}
tmpf <- tempfile()
download.file(url, tmpf)
dir.create(dirname(dest_file), recursive = TRUE, showWarnings = FALSE)
R.utils::gunzip(tmpf, dest_file)
message(glue::glue("extension {extension_name} installée dans {dest_file}"))
}
Please register or sign in to comment