-
ronan.vignard authoredronan.vignard authored
flat_create_table_sequence.Rmd 11.48 KiB
title: "Cr\u00e9ation des tables et des s\u00e9quences"
output: html_document
editor_options:
chunk_output_type: console
library(testthat)
library(yaml)
library(glue)
library(DBI)
library(datalibaba)
# Load already included functions if relevant
pkgload::load_all(export_all = FALSE)
# Lire le fichier de configuration
config <- yaml::read_yaml("config.yml")
# Accéder aux valeurs pour version et last_year
version <- config$version
last_year <- config$last_year
Présentation
Cette page contient les fonctions permettant :
- de créer en base la table
nitrates.nitrate_prelevement_analyse_version
, - d'incrémenter la séquence correspondante au moment de l'import des données.
Création de la table en base
Création de la table des prélèvements et analyses et ajout des commentaires
#' Créer une table de prélèvements et analyses de nitrates
#'
#' @description Cette fonction crée une table dans une base de données PostgreSQL
#' pour stocker les informations relatives aux prélèvements et analyses de
#' nitrates, incluant les contraintes et les séquences nécessaires.
#'
#' @param version String. Version de la table (par exemple, 'v1').
#' @param last_year Integer. L'année la plus récente incluse dans les données de la table.
#'
#' @return String. Le script SQL utilisé pour créer la table.
#' @export
#' @importFrom datalibaba connect_to_db
create_table_nitrate_prelevement_analyse <- function(version, last_year) {
# Établir une connexion à la base de données PostgreSQL
connexion <- datalibaba::connect_to_db(db = "si_eau", user = "admin")
# Génération de la date du jour
date_now <- format(Sys.Date(), "%d/%m/%Y")
# Liste des requêtes SQL
sql_commands <- c(
glue::glue("CREATE TABLE IF NOT EXISTS nitrates.nitrate_prelevement_analyse_{version} (
code_prelevement_analyse serial NOT NULL,
code_intervenant character varying(20),
source character varying(10),
code_reseau character varying(254),
code_station character varying(10),
date_prelevement date,
heure_prelevement character varying(8),
code_support integer,
nature_eau character varying(3),
id_usage character varying(3),
id_prelevement_motif character varying(2),
commentaire character varying(254),
code_parametre bigint,
code_fraction_analysee integer,
date_analyse date,
resultat_analyse double precision,
code_remarque integer,
limite_detection double precision,
limite_quantification double precision,
CONSTRAINT pk_nitrate_prelevement_analyse_{version} PRIMARY KEY (code_prelevement_analyse),
CONSTRAINT fk_n_support FOREIGN KEY (code_support)
REFERENCES sandre.n_support (code_support) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE SET DEFAULT,
CONSTRAINT fk_parametre FOREIGN KEY (code_parametre)
REFERENCES qualite_cours_d_eau.parametre (code_parametre) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE SET DEFAULT,
CONSTRAINT fk_n_fraction_analysee FOREIGN KEY (code_fraction_analysee)
REFERENCES sandre.n_fraction_analysee (code_fraction_analysee) MATCH SIMPLE
ON UPDATE CASCADE ON DELETE SET DEFAULT,
CONSTRAINT fk_n_remarque FOREIGN KEY (code_remarque)
REFERENCES sandre.n_remarque (code_remarque) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION
) WITH (OIDS=FALSE);"),
glue::glue("ALTER TABLE nitrates.nitrate_prelevement_analyse_{version} OWNER TO adminpsql;"),
glue::glue("GRANT ALL ON TABLE nitrates.nitrate_prelevement_analyse_{version} TO adminpsql;"),
glue::glue("GRANT ALL ON TABLE nitrates.nitrate_prelevement_analyse_{version} TO writer_production;"),
glue::glue("GRANT SELECT ON TABLE nitrates.nitrate_prelevement_analyse_{version} TO reader_production;"),
glue::glue("COMMENT ON TABLE nitrates.nitrate_prelevement_analyse_{version} IS
'Table des prélèvements et analyses 2007-{last_year} (version {version} du {date_now})';"),
glue::glue("CREATE SEQUENCE IF NOT EXISTS nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_analyse_seq
INCREMENT 1 START 1 MINVALUE 1 MAXVALUE 2147483647 CACHE 1;"),
glue::glue("ALTER SEQUENCE nitrates.nitrate_prelevement_analyse_{version}_code_prelevement_analyse_seq
OWNER TO adminpsql;")
)
# Ajout des commentaires sur chaque champ
comments_sql <- c(
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_prelevement_analyse IS 'Identifiant du prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_intervenant IS 'Identifiant de l''intervenant';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.source IS 'Source de la donnée';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_reseau IS 'Identifiant du réseau';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_station IS 'Identifiant de la station';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.date_prelevement IS 'Date du prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.heure_prelevement IS 'Heure du prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_support IS 'Code du support de prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.nature_eau IS 'Nature de l''eau du prélèvement (ESO/ESU)';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.id_usage IS 'Code de l''usage du prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.id_prelevement_motif IS 'Code du motif du prélèvement';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.commentaire IS 'Commentaire';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_parametre IS 'Identifiant du paramètre analysé';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_fraction_analysee IS 'Identifiant de la fraction analysée';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.date_analyse IS 'Date de l''analyse';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.resultat_analyse IS 'Résultat de l''analyse';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.code_remarque IS 'Code validant la donnée';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.limite_detection IS 'Limite de détection';"),
glue::glue("COMMENT ON COLUMN nitrates.nitrate_prelevement_analyse_{version}.limite_quantification IS 'Limite de quantification';")
)
# Exécuter chaque commande SQL
for (sql in c(sql_commands, comments_sql)) {
DBI::dbExecute(connexion, sql)
}
# Fermeture de la connexion à la base de données
DBI::dbDisconnect(connexion)
# Retourne toutes les commandes exécutées
return(c(sql_commands, comments_sql))
}