Skip to content
Snippets Groups Projects

Installer une extension duckdb dans R à travers un proxy

  • Clone with SSH
  • Clone with HTTPS
  • Embed
  • Share
    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;'>
    Edited
    dl_duckdb_extension.R 2.02 KiB
    #' 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}"))
    }
    0% Loading or .
    You are about to add 0 people to the discussion. Proceed with caution.
    Finish editing this message first!
    Please register or to comment