Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
database:exemple-import-synthese [2020/08/06 09:17] – [Format de la table ACQUISITION_FRAMEWORK d'import] jpmilcent | database:exemple-import-synthese [2020/08/06 15:19] (Version actuelle) – créée jpmilcent | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ====== Exemple d' | + | ~~REDIRECT>database:import-formats~~ |
- | + | ||
- | ===== Processus d' | + | |
- | Pour importer les données (initialement ou en mise à jour), nous utiliserons des fichiers CSV associé à la commande //COPY//. | + | |
- | Ces fichiers CSV devront : | + | |
- | * être encodée en **UTF-8** | + | |
- | * utiliser une **tabulation** comme caractère de séparation des champs | + | |
- | * posséder une **première ligne d' | + | |
- | * utiliser les caractères **\N** pour indiquer une valeur nulle (//NULL//) pour un champ | + | |
- | * si nécessaire utiliser le caractère **guillemet** (") pour préfixer et suffixer une valeur de champ | + | |
- | * si nécessaire utiliser **deux guillemets** successifs ("" | + | |
- | + | ||
- | **TODO** : | + | |
- | * voir si on utilise plutôt un chaine vide sans guillemet pour indiquer une valeur NULL | + | |
- | * A priori, l' | + | |
- | ==== Import initial ==== | + | |
- | + | ||
- | * L' | + | |
- | * Nous utiliserons plusieurs fichiers CSV respectant tous le même format (voir ci-dessus) | + | |
- | * Le détail des différents fichiers (organism, acquistion_framework, | + | |
- | * Un seul fichier CSV est obligatoire // | + | |
- | * Dans ces fichiers CSV, nous utiliserons les codes alphanumériques des valeurs pour les champs devant contenir des **identifiant de nomenclatures**. Un script Python se connectant à la base de GeoNature permettra de récupérer l' | + | |
- | * Pour les lien avec les **organismes**, | + | |
- | * L' | + | |
- | * Un script Python sera chargé de vérifier les données CSV et de remplacer les différents codes standard par leur identifiant numérique spécifique à la base de données courante. | + | |
- | * Des scripts SQL se chargeront de désactiver triggers, contraintes... puis de les réactiver et exécuter globalement après la commande de //COPY// d' | + | |
- | * De cette façon, nous pouvons espérer intégrer jusqu' | + | |
- | ==== Mise à jour ==== | + | |
- | * Pour chaque mise à jour, nous devrons importer seulement un différentiel : | + | |
- | * le différentiel sera réalisé en local sur une machine disposant d' | + | |
- | * le nombre moins important de données nous permettra de réaliser rapidement la mise à jour de la table // | + | |
- | * le différentiel sera fournie au format CSV (voir ci-dessus) | + | |
- | * le fichier CSV sera importé dans une première table d' | + | |
- | * Nous procéderons pour l' | + | |
- | * Ajout des nouvelles observations | + | |
- | * Modification des observations existantes qui ont été modifiée depuis le dernier import | + | |
- | * Suppression des observations qui ne sont plus présente dans l' | + | |
- | * Pour réaliser le différentiel, | + | |
- | * La clé primaire des données d' | + | |
- | * Le champ "// | + | |
- | * Dans le cas des observations modifiées, le champ "// | + | |
- | * Pour les champs contenant des **identifiant de nomenclatures**, | + | |
- | * Pour les lien avec les **organismes**, | + | |
- | * L' | + | |
- | + | ||
- | ===== Format SYNTHESE d' | + | |
- | Permet de fournir les informations sur les observations. | + | |
- | Correspond à la table "// | + | |
- | + | ||
- | * unique_id_sinp [UUID] : UUID SINP s'il existe déjà dans les données sources. | + | |
- | * unique_id_sinp_grp [UUID] : UUID SINP du relevé s'il existe déjà dans les données sources. | + | |
- | * code_source [VARCHAR(255)] (=// | + | |
- | * entity_source_pk_value [VARCHAR(25)] : code alphanumérique correspondant à l' | + | |
- | * code_dataset [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_geo_object_nature [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_grp_typ [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_obs_meth [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_obs_technique [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_bio_status [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_bio_condition [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_naturalness [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_exist_proof [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_valid_status [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_diffusion_level [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_life_stage [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_sex [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_obj_count [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_type_count [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_sensitivity [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_observation_status [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_blurring [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_source_status [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_info_geo_type [VARCHAR(25)] (=// | + | |
- | * reference_biblio [VARCHAR(255)] : | + | |
- | * count_min [INT(4)] : | + | |
- | * count_max [INT(4)] : | + | |
- | * cd_nom [INT(4)] : | + | |
- | * **nom_cite** [VARCHAR(1000)] : | + | |
- | * meta_v_taxref [VARCHAR(50)] : | + | |
- | * sample_number_proof [TEXT] : | + | |
- | * digital_proof [TEXT] : | + | |
- | * non_digital_proof [TEXT] : | + | |
- | * altitude_min [INT(4)] : | + | |
- | * altitude_max [INT(4)] : | + | |
- | * geom_4326 [geometry(Geometry, | + | |
- | * geom_point [geometry(Point, | + | |
- | * geom_local [geometry(Geometry, | + | |
- | * **date_min** [DATE(YYYY-MM-DD HH:MM:SS)] : | + | |
- | * **date_max** [DATE(YYYY-MM-DD HH:MM:SS)] : | + | |
- | * validator [VARCHAR(1000)] : | + | |
- | * validation_comment [TEXT] : | + | |
- | * observers [VARCHAR(1000)] : | + | |
- | * determiner [VARCHAR(1000)] : | + | |
- | * id_digitiser [INT(4)]: TODO voir si on garde ou pas ce champ. | + | |
- | * code_nomenclature_determination_method [VARCHAR(25)] (=// | + | |
- | * comment_context [TEXT] : | + | |
- | * comment_description [TEXT] : | + | |
- | * meta_validation_date [DATE(YYYY-MM-DD HH:MM:SS)] : date et heure de validation de l' | + | |
- | * **meta_create_date** [DATE(YYYY-MM-DD HH:MM:SS)] : date et heure de création de l' | + | |
- | * meta_update_date [DATE(YYYY-MM-DD HH:MM:SS)] : date et heure de mise à jour de l' | + | |
- | * **meta_last_action** [CHAR(1)] (=// | + | |
- | + | ||
- | ===== Format SOURCE d' | + | |
- | Permet de décrire la source des données.\\ | + | |
- | Correspond à la table "// | + | |
- | + | ||
- | * **name** [VARCHAR(255)] : correspond au champ "// | + | |
- | * desc [TEXT] : description de la source des données. Correspond au champ "// | + | |
- | * entity_source_pk_field [VARCHAR(255)] : nom du champ dans les données sources servant de clé primaire et dont la valeur est présente dans le champ "// | + | |
- | * url [VARCHAR(255)] : adresse web décrivant la source des données ou permettant d' | + | |
- | * **meta_create_date** [DATE YYYY-MM-DD HH:MM:SS] : date et heure de création de l' | + | |
- | * meta_update_date [DATE YYYY-MM-DD HH:MM:SS] : date et heure de mise à jour de l' | + | |
- | * **meta_last_action** [CHAR(1)] : permet d' | + | |
- | + | ||
- | ===== Format de la table DATASET d' | + | |
- | Permet de fournir les informations sur les jeux de données.\\ | + | |
- | Correspond à la table "// | + | |
- | **NOTES :** pour éviter trop de complexité, | + | |
- | + | ||
- | * **id_dataset** [INT(4)] : id auto-incrémenté servant de clé primaire. TODO: voir s'il est vraiment nécessaire de garder ce champ. | + | |
- | * unique_id [UUID] (=// | + | |
- | * **code_acquisition_framework** [VARCHAR(255)] (=// | + | |
- | * **name** [VARCHAR(255)] (=// | + | |
- | * **shortname** [VACHAR(255)] (=// | + | |
- | * **desc** [TEXT] (=// | + | |
- | * code_nomenclature_data_type [VARCHAR(25)] (=// | + | |
- | * keywords [TEXT] | + | |
- | * marine_domain [BOOL] | + | |
- | * terrestrial_domain [BOOL] | + | |
- | * code_nomenclature_dataset_objectif [VARCHAR(25)] (=// | + | |
- | * bbox_west [FLOAT] | + | |
- | * bbox_est [FLOAT] | + | |
- | * bbox_south [FLOAT] | + | |
- | * bbox_north [FLOAT] | + | |
- | * code_nomenclature_collecting_method [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_data_origin [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_source_status [VARCHAR(25)] (=// | + | |
- | * code_nomenclature_resource_type [VARCHAR(25)] (=// | + | |
- | * cor_territory [TEXT(ARRAY-ARRAY)] : champ de type tableau de tableau de textes. Les tableaux de textes du plus bas niveau contiendront comme première valeur le code de nomenclature correspondant au champ "// | + | |
- | * cor_actors_organism [TEXT(ARRAY-ARRAY)] | + | |
- | * **meta_create_date** [DATE(YYYY-MM-DD HH:MM:SS)] : date et heure de création de l' | + | |
- | * meta_update_date [DATE(YYYY-MM-DD HH:MM:SS)] : date et heure de mise à jour de l' | + | |
- | * **meta_last_action** [CHAR(1)] : permet d' | + | |
- | + | ||
- | ===== Format de la table ACQUISITION_FRAMEWORK d' | + | |
- | Permet de fournir les informations sur les cadres d' | + | |
- | Correspond à la table "// | + | |
- | **NOTES :** pour éviter trop de complexité, | + | |
- | + | ||
- | * unique_id [UUID] (=// | + | |
- | * **name** [VARCHAR(255)] (=// | + | |
- | * **desc** [TEXT] (=// | + | |
- | * code_nomenclature_territorial_level [VARCHAR(25)] (=// | + | |
- | * territory_desc [TEXT] | + | |
- | * keywords [TEXT] | + | |
- | * code_nomenclature_financing_type [VARCHAR(25)] (=// | + | |
- | * target_description [TEXT] | + | |
- | * ecologic_or_geologic_target [TEXT] | + | |
- | * parent_code [VARCHAR(255)](=// | + | |
- | * is_parent [BOOL] | + | |
- | * **start_date** [DATE(YYYY-MM-DD)] (=// | + | |
- | * end_date [DATE(YYYY-MM-DD)] (=// | + | |
- | * cor_objectifs [TEXT(ARRAY)] : champ de type tableau de textes. Le tableau contiendra une succession | + | |
- | * cor_voletsinp [TEXT(ARRAY)] : champ de type tableau de textes. Le tableau contiendra une succession de codes de nomenclature correspondant au champ "// | + | |
- | * cor_actors_organism [TEXT(ARRAY-ARRAY)] : champ de type tableau de tableau de textes. Les tableaux de textes du plus bas niveau contiendront comme première valeur le nom de l' | + | |
- | * **meta_create_date** [DATE(YYYY-MM-DD HH:MM:SS)] : date et heure de création de l' | + | |
- | * meta_update_date [DATE(YYYY-MM-DD HH:MM:SS)] : date et heure de mise à jour de l' | + | |
- | * **meta_last_action** [CHAR(1)] : permet d' | + | |
- | ===== Format de la table ORGANISM d' | + | |
- | Permet de fournir les informations sur les organismes liées aux jeux de données et cadres d' | + | |
- | Correspond à la table table "// | + | |
- | + | ||
- | * **id_organism** [INT(4)] : id auto-incrémenté servant de clé primaire. TODO: voir s'il est vraiment nécessaire de garder ce champ. | + | |
- | * unique_id [UUID] : UUID de l' | + | |
- | * **name** [VARCHAR(100)] : correspond au champ " | + | |
- | * address [VARCHAR(128)] : correspond au champ " | + | |
- | * postal_code [VARCHAR(5)] : correspond au champ " | + | |
- | * city [VARCHAR(100)] : correspond au champ " | + | |
- | * phone [VARCHAR(14)] : correspond au champ " | + | |
- | * fax [VARCHAR(14)] : correspond au champ " | + | |
- | * email [VARCHAR(100)] : correspond au champ " | + | |
- | * url [VARCHAR(255)] : correspond au champ " | + | |
- | * logo_url [VARCHAR(255)] : correspond au champ " | + | |
- | * **meta_create_date** [DATE(YYYY-MM-DD HH:MM:SS)] : date et heure de création de l' | + | |
- | * meta_update_date [DATE(YYYY-MM-DD HH:MM:SS)] : date et heure de mise à jour de l' | + | |
- | * **meta_last_action** [CHAR(1)] : permet d' | + | |
- | ===== Exemple de code SQL d' | + | |
- | * Ceci est un exmple pouvant servir de base au format d' | + | |
- | * Le fichier SQL doit être présent en local sur le serveur où se trouve la base de données | + | |
- | * Nous importons les données dans un schema " | + | |
- | * La ligne de commande à utiliser : <code bash> psql -h localhost -d "< | + | |
- | * Nous supprimons toutes les clés étrangères et les liens avec des tables extérieures pour simplifier l' | + | |
- | * <todo @jpmilcent> | + | |
- | * <todo @jpmilcent> | + | |
- | * <todo @jpmilcent> | + | |
- | + | ||
- | <code sql> | + | |
- | -- | + | |
- | -- PostgreSQL - Example GeoNature synthese import | + | |
- | -- | + | |
- | BEGIN; | + | |
- | + | ||
- | SET statement_timeout = 0; | + | |
- | SET lock_timeout = 0; | + | |
- | SET client_encoding = ' | + | |
- | SET standard_conforming_strings = on; | + | |
- | SET check_function_bodies = false; | + | |
- | SET client_min_messages = warning; | + | |
- | + | ||
- | CREATE SCHEMA IF NOT EXISTS imports; | + | |
- | + | ||
- | SET search_path = imports, pg_catalog; | + | |
- | SET default_tablespace = ''; | + | |
- | SET default_with_oids = false; | + | |
- | + | ||
- | DROP SEQUENCE IF EXISTS synthese_id_synthese_seq CASCADE ; | + | |
- | + | ||
- | CREATE SEQUENCE synthese_id_synthese_seq | + | |
- | INCREMENT BY 1 | + | |
- | MINVALUE 1 | + | |
- | MAXVALUE 9223372036854775807 | + | |
- | START 1 | + | |
- | CACHE 1 | + | |
- | NO CYCLE; | + | |
- | + | ||
- | DROP TABLE IF EXISTS synthese_faune CASCADE ; | + | |
- | + | ||
- | CREATE TABLE synthese_faune ( | + | |
- | id_synthese integer DEFAULT nextval(' | + | |
- | unique_id_sinp uuid, | + | |
- | unique_id_sinp_grp uuid, | + | |
- | id_source integer, | + | |
- | id_module integer, | + | |
- | entity_source_pk_value character varying, | + | |
- | id_dataset integer, | + | |
- | id_nomenclature_geo_object_nature integer NULL, | + | |
- | id_nomenclature_grp_typ integer NULL, | + | |
- | id_nomenclature_obs_meth integer NULL, | + | |
- | id_nomenclature_obs_technique integer NULL, | + | |
- | id_nomenclature_bio_status integer NULL, | + | |
- | id_nomenclature_bio_condition integer NULL, | + | |
- | id_nomenclature_naturalness integer NULL, | + | |
- | id_nomenclature_exist_proof integer NULL, | + | |
- | id_nomenclature_valid_status integer NULL, | + | |
- | id_nomenclature_diffusion_level integer NULL, | + | |
- | id_nomenclature_life_stage integer NULL, | + | |
- | id_nomenclature_sex integer NULL, | + | |
- | id_nomenclature_obj_count integer NULL, | + | |
- | id_nomenclature_type_count integer NULL, | + | |
- | id_nomenclature_sensitivity integer NULL, | + | |
- | id_nomenclature_observation_status integer NULL, | + | |
- | id_nomenclature_blurring integer NULL, | + | |
- | id_nomenclature_source_status integer NULL, | + | |
- | id_nomenclature_info_geo_type integer NULL, | + | |
- | count_min integer, | + | |
- | count_max integer, | + | |
- | cd_nom integer, | + | |
- | nom_cite character varying(1000) NOT NULL, | + | |
- | meta_v_taxref character varying(50) NULL, | + | |
- | sample_number_proof text, | + | |
- | digital_proof text, | + | |
- | non_digital_proof text, | + | |
- | altitude_min integer, | + | |
- | altitude_max integer, | + | |
- | the_geom_4326 public.geometry(Geometry, | + | |
- | the_geom_point public.geometry(Point, | + | |
- | the_geom_local public.geometry(Geometry, | + | |
- | date_min timestamp without time zone NOT NULL, | + | |
- | date_max timestamp without time zone NOT NULL, | + | |
- | validator character varying(1000), | + | |
- | validation_comment text, | + | |
- | observers character varying(1000), | + | |
- | determiner character varying(1000), | + | |
- | id_digitiser integer, | + | |
- | id_nomenclature_determination_method integer NULL, | + | |
- | comment_context text, | + | |
- | comment_description text, | + | |
- | meta_validation_date timestamp without time zone, | + | |
- | meta_create_date timestamp without time zone DEFAULT now(), | + | |
- | meta_update_date timestamp without time zone DEFAULT now(), | + | |
- | last_action character(1), | + | |
- | CONSTRAINT check_synthese_altitude_max CHECK ((altitude_max >= altitude_min)), | + | |
- | CONSTRAINT check_synthese_count_max CHECK ((count_max >= count_min)), | + | |
- | CONSTRAINT check_synthese_date_max CHECK ((date_max >= date_min)), | + | |
- | CONSTRAINT enforce_dims_the_geom_4326 CHECK ((public.st_ndims(the_geom_4326) = 2)), | + | |
- | CONSTRAINT enforce_dims_the_geom_local CHECK ((public.st_ndims(the_geom_local) = 2)), | + | |
- | CONSTRAINT enforce_dims_the_geom_point CHECK ((public.st_ndims(the_geom_point) = 2)), | + | |
- | CONSTRAINT enforce_geotype_the_geom_point CHECK (((public.geometrytype(the_geom_point) = ' | + | |
- | CONSTRAINT enforce_srid_the_geom_4326 CHECK ((public.st_srid(the_geom_4326) = 4326)), | + | |
- | CONSTRAINT enforce_srid_the_geom_local CHECK ((public.st_srid(the_geom_local) = 2154)), | + | |
- | CONSTRAINT enforce_srid_the_geom_point CHECK ((public.st_srid(the_geom_point) = 4326)) | + | |
- | ); | + | |
- | + | ||
- | + | ||
- | \copy synthese_faune (id_synthese, | + | |
- | 24977967 \N \N 1 \N 96495756 3 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N 1 1 3297 LARFUS \N \N \N \N 0 0 0101000020E61000004777103B53881240ADFA5C6DC5D64540 0101000020E61000004777103B53881240ADFA5C6DC5D64540 01010000206A080000B81E85EBCB61294148E17AA487FC5741 1994-01-09 00: | + | |
- | 24977968 \N \N 1 \N 96595425 3 \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N \N 1 1 3297 LARFUS \N \N \N \N 0 0 0101000020E61000004777103B53881240ADFA5C6DC5D64540 0101000020E61000004777103B53881240ADFA5C6DC5D64540 01010000206A080000B81E85EBCB61294148E17AA487FC5741 1994-06-24 00: | + | |
- | \. | + | |
- | + | ||
- | + | ||
- | ALTER TABLE ONLY synthese_faune | + | |
- | ADD CONSTRAINT pk_synthese PRIMARY KEY (id_synthese); | + | |
- | + | ||
- | ALTER TABLE ONLY synthese_faune | + | |
- | ADD CONSTRAINT unique_id_sinp_unique UNIQUE (unique_id_sinp); | + | |
- | + | ||
- | CREATE INDEX i_synthese_altitude_max ON synthese_faune USING btree (altitude_max); | + | |
- | + | ||
- | CREATE INDEX i_synthese_altitude_min ON synthese_faune USING btree (altitude_min); | + | |
- | + | ||
- | CREATE INDEX i_synthese_cd_nom ON synthese_faune USING btree (cd_nom); | + | |
- | + | ||
- | CREATE INDEX i_synthese_date_max ON synthese_faune USING btree (date_max DESC); | + | |
- | + | ||
- | CREATE INDEX i_synthese_date_min ON synthese_faune USING btree (date_min DESC); | + | |
- | + | ||
- | CREATE INDEX i_synthese_id_dataset ON synthese_faune USING btree (id_dataset); | + | |
- | + | ||
- | CREATE INDEX i_synthese_t_sources ON synthese_faune USING btree (id_source); | + | |
- | + | ||
- | CREATE INDEX i_synthese_the_geom_4326 ON synthese_faune USING gist (the_geom_4326); | + | |
- | + | ||
- | CREATE INDEX i_synthese_the_geom_local ON synthese_faune USING gist (the_geom_local); | + | |
- | + | ||
- | CREATE INDEX i_synthese_the_geom_point ON synthese_faune USING gist (the_geom_point); | + | |
- | + | ||
- | COMMIT; | + | |
- | </ | + |