Objectif

Un historique est conservée pour les tables suivantes :

France entière :

  • n_arrondissement_exp_000
  • n_commune_exp_000
  • n_departement_exp_000
  • n_epci_exp_000
  • n_region_exp_000

Région Pays de la Loire :

  • n_arrondissement_exp_r52
  • n_commune_exp_r52
  • n_departement_exp_r52
  • n_epci_exp_r52
  • n_region_exp_r52

Chargement des librairies

library(datalibaba)
library(DBI)
library(yaml)

Configuration

Chargement des variables

À faire impérativement : configurer ou vérifier les paramètres du fichier config.yml avant chargement.

Les paramètres suivants sont ensuite récupérés :

  • base de données de travail
  • schéma de travail
  • rôle de connexion
  • emprise des lots de données
# Charger le fichier YAML
config <- yaml::read_yaml("../config.yml")

# Récupérer les variables
database <- config$database
schema_name <- config$schema_name
role <- config$role
emprise <- config$emprise

Obtenir l’année N-1

Calcul du millésime archivé par rapport à l’année en cours :

annee_actuelle <- as.numeric(format(Sys.Date(), "%Y"))
aaaa <- annee_actuelle - 1

Connection à la base de données PostgreSQL

connexion <- datalibaba::connect_to_db(db = database, user = role)

Traitements des tables

Attention : il faut paramétrer au préalable l’emprise dans le fichier config.yml :

  • valeur “000” pour la France entière
  • valeur “r52” pour la région Pays de la Loire

Renommer les tables en N-1

# Liste des entités à renommer
entities <- c("arrondissement", "commune", "departement", "epci", "region")

# Boucle sur chaque entité pour créer le nouveau nom et effectuer le renommage
for (entity in entities) {
  old_table <- paste0(schema_name, ".n_", entity, "_exp_", emprise)
  new_table <- paste0("n_", entity, "_exp_", aaaa, "_", emprise)
  tryCatch({
      DBI::dbExecute(connexion,
                     sprintf("ALTER TABLE %s RENAME TO %s;", 
                             old_table, new_table))
      message(sprintf("Table renommée avec succès : %s -> %s", 
                      old_table, new_table))
    },
    error = function(e) {
      message(sprintf("Erreur : la table %s n'a pas pu être renommée (%s)", 
                      old_table, e$message))
    }
  )
}

Renommer les clés primaires en N-1

# Suppression et création de la clé primaire sur les nouvelles tables
for (entity in entities) {
  old_constraint <- sprintf("pk_n_%s_exp_%s", entity, emprise)
  new_constraint <- sprintf("pk_n_%s_exp_%s_%s", entity, aaaa, emprise)
  table <- sprintf("n_%s_exp_%s_%s", entity, aaaa, emprise)
  
  tryCatch({
    # Suppression de l'ancienne contrainte
    DBI::dbExecute(connexion, 
                   sprintf("ALTER TABLE %s.%s DROP CONSTRAINT %s;", 
                           schema_name, table, old_constraint))
    # Ajout de la nouvelle clé primaire avec le nouveau nom de contrainte
    DBI::dbExecute(connexion, 
                   sprintf("ALTER TABLE %s.%s ADD CONSTRAINT %s PRIMARY KEY (id);", 
                           schema_name, table, new_constraint))
    # Message en cas de succès
    message(sprintf("Clé primaire renommée avec succès sur %s.%s : %s -> %s", 
                    schema_name, table, old_constraint, new_constraint))
  },
  error = function(e) {
    # Message en cas d'erreur
    message(sprintf("Erreur pour %s.%s lors du renommage de %s -> %s : %s", 
                    schema_name, table, old_constraint, 
                    new_constraint, e$message))
  })
}

Renommer les index spatiaux en N-1

# Boucle sur chaque entité
for (entity in entities) {
  old_index <- sprintf("%s.gix_n_%s_exp_%s", schema_name, entity, emprise)
  new_table <- sprintf("n_%s_exp_%s_%s", entity, aaaa, emprise)
  new_index <- sprintf("gix_%s", new_table)
  
  # Suppression de l'ancien index spatial
  tryCatch({
    DBI::dbExecute(connexion, sprintf("DROP INDEX IF EXISTS %s;", old_index))
    message(sprintf("Index supprimé (ou déjà absent) : %s", old_index))
  },
  error = function(e) {
    message(sprintf("Erreur lors de la suppression de l'index %s : %s", 
                    old_index, e$message))
  })
  
  # Création du nouvel index spatial avec le millésime
  tryCatch({
    DBI::dbExecute(
      connexion,
      sprintf("CREATE INDEX IF NOT EXISTS %s ON %s.%s USING gist (the_geom);", 
              new_index, schema_name, new_table)
    )
    message(
      sprintf("Index spatial créé (ou déjà existant) : %s sur %s.%s", 
              new_index, schema_name, new_table))
  },
  error = function(e) {
    message(sprintf("Erreur lors de la création de l'index %s sur %s.%s : %s", 
                    new_index, schema_name, new_table, e$message))
  })
}

# Fermeture de la connexion
DBI::dbDisconnect(connexion)