---
url: /articles/cout.md
description: >-
  Cette page décrit les couts d'acquisition de PostgreSQL quelle que soit le
  mode d'hébergement
---

# Coûts

PostgreSQL est un système de gestion de base de données relationnelle open source,
ce qui signifie que son acquisition et son utilisation de base sont gratuites.

Vous pouvez télécharger, installer et utiliser PostgreSQL sans frais de licence, que ce soit pour un usage personnel, professionnel ou même à grande échelle.

Cependant, des coûts peuvent survenir si vous choisissez d’utiliser des services gérés (comme OVH, Amazon RDS for PostgreSQL, Google Cloud SQL, ou d’autres hébergeurs spécialisés).

Dans ce cas, les coûts dépendent principalement de la consommation de ressources (vCPU, mémoire, stockage, transfert de données, etc.) et des options de support étendu pour les versions obsolètes.

Par exemple, AWS facture environ 0,10 $ par vCPU-heure pour certaines configurations en 2025, et Google Cloud propose des calculateurs pour estimer vos coûts selon vos besoins.

En résumé :

* `PostgreSQL` lui-même est gratuit et open source.
* Les coûts proviennent de l’hébergement, de la gestion et des services associés si vous passez par un fournisseur cloud ou un hébergeur spécialisé.

## Auto hébergement (On Premise)

L’auto-hébergement (aussi appelé On Prémise dans les offres) de PostgreSQL implique que vous gérez vous-même l’infrastructure (serveur physique, machine virtuelle, ou conteneur) sur laquelle la base de données s’exécute.

Voici les principaux coûts à prévoir dans ce cas :

### Coût du matériel

* **Serveur physique** : Achat ou location d’un serveur dédié (coût variable selon la puissance : de quelques centaines à plusieurs milliers d’euros).
* **Machine virtuelle (VPS/Cloud)** : Si vous utilisez un fournisseur comme OVH, DigitalOcean, Linode, AWS EC2, ou Google Compute Engine, les coûts dépendent de la taille de l’instance (vCPU, RAM, stockage). Par exemple, une petite instance peut coûter entre 5 € et 20 €/mois, tandis qu’une instance plus puissante peut atteindre 100 €/mois ou plus.

### Coût du stockage

* **Disques durs/SSD** : Le coût dépend de la capacité et du type de stockage (SSD plus cher mais plus performant). Comptez quelques euros à plusieurs dizaines d’euros par mois pour du stockage cloud, ou un investissement initial pour du stockage local.

### Coût du système d'exploitation

En fonction du système d'exploitation choisi, des coûts supplémentaires seront à prévoir comme:

* Licence de l'OS (Ex Windows)
* Contrat de maintenance et/ou de support

### Coût de la maintenance et de l’administration

* **Temps humain** : Si vous gérez vous-même l’administration (installation, mises à jour, sauvegardes, sécurité, monitoring), cela représente un coût en temps (ou en salaire si vous externalisez).
* **Outils de monitoring/sauvegarde** : Certains outils (comme pgBackRest, Prometheus, Grafana) sont gratuits, mais d’autres solutions professionnelles peuvent avoir un coût.

### Coût de la bande passante et de l’électricité

* **Bande passante** : Si vous hébergez chez un fournisseur cloud, la bande passante sortante peut être facturée (souvent quelques centimes par Go).
* **Électricité et refroidissement** : Pour un serveur physique en local, il faut compter le coût énergétique et éventuellement la climatisation.

### Coût des sauvegardes externes

* **Stockage externe** : Sauvegarder vos données sur un autre site ou dans le cloud (S3, Backblaze, etc.) peut engendrer des coûts supplémentaires (quelques euros à quelques dizaines d’euros par mois selon le volume).

### Exemple de budget mensuel pour un auto-hébergement cloud (VPS) :

| Poste de coût                   | Coût estimé (par mois) |
|---------------------------------|:----------------------:|
| Instance VPS (2 vCPU, 4 Go RAM) | 10 € – 30 €            |
| Stockage (50 Go SSD)            | 2 € – 10 €             |
| Bande passante                  | 0 € – 5 €              |
| Sauvegardes externes            | 2 € – 10 €             |
| **Total estimé**                | **14 € – 55 €**        |

### En résumé

* **PostgreSQL lui-même est gratuit** (pas de licence).
* **Les coûts viennent de l’infrastructure, de la maintenance et des services associés**.
* **L’auto-hébergement est souvent moins cher que les solutions gérées**, mais demande plus de compétences techniques.

## Hébergement distant

Pour un hébergement distant de PostgreSQL, les coûts à prévoir dépendent principalement du type d’hébergement choisi (cloud, dédié, managé) et des ressources nécessaires (stockage, RAM, CPU, trafic réseau).

Voici une synthèse des principaux postes de coûts et des fournisseurs populaires en 2025 :

### Hébergement Cloud (PaaS/DBaaS)

Les solutions cloud sont les plus flexibles et facturées à l’usage.

| Fournisseur         | Offre de base (2025)         | Coût mensuel estimé (EUR) | Remarques                                                                 |
|---------------------|------------------------------|:-------------------------:|---------------------------------------------------------------------------|
| **AWS RDS**         | db.t4g.micro (1 vCPU, 1 GiB) | ~15-25 €                  | Facturation à l’heure, stockage supplémentaire payant                     |
| **Google Cloud SQL**| 1 vCPU, 3.75 Go RAM          | ~20-30 €                  | Inclut 10 Go de stockage, sauvegardes automatiques                        |
| **Azure Database**  | Basic (1 vCPU, 2 Go RAM)     | ~25-35 €                  | Intégration avec l’écosystème Microsoft                                   |
| **DigitalOcean**    | 1 vCPU, 1 Go RAM, 10 Go SSD  | ~15 €                     | Simple, adapté aux petits projets                                         |
| **Scaleway**        | Startup (2 vCPU, 4 Go RAM)   | ~20 €                     | Prix compétitifs, hébergé en Europe                                       |

***

### Hébergement VPS/Dédié

Si vous préférez gérer vous-même l’instance PostgreSQL sur un serveur virtuel ou dédié:

| Fournisseur         | Offre de base (2025)         | Coût mensuel estimé (EUR) | Remarques                                                                 |
|---------------------|------------------------------|:-------------------------:|---------------------------------------------------------------------------|
| **OVHcloud**        | VPS (2 vCPU, 4 Go RAM)       | ~10-20 €                  | Installation manuelle de PostgreSQL, coût variable selon la configuration |
| **Hetzner**         | CX21 (2 vCPU, 4 Go RAM)      | ~5-10 €                   | Très économique, idéal pour les développeurs                              |
| **Linode**          | 2 vCPU, 4 Go RAM             | ~12-15 €                  | Bonne réputation pour la stabilité                                        |

***

### Coûts supplémentaires à prévoir

* **Stockage supplémentaire** : ~0,10-0,30 €/Go/mois selon le fournisseur.
* **Sauvegardes automatiques** : Souvent incluses, sinon ~5-10 €/mois.
* **Trafic réseau** : Généralement gratuit jusqu’à un certain seuil, puis ~0,05-0,10 €/Go.
* **Support technique** : Option payante chez certains fournisseurs (ex : AWS Support Business ~100 €/mois).

### Exemple de budget mensuel

* **Petit projet** : 10-20 €/mois (VPS ou DBaaS basique)
* **Projet moyen** : 30-60 €/mois (DBaaS avec sauvegardes et monitoring)
* **Gros projet** : 100 € et plus (instances dédiées, haute disponibilité)

### Conseils pour optimiser les coûts

* **Choisir un fournisseur européen** si vos utilisateurs sont en Europe (latence, RGPD).
* **Utiliser des instances “serverless”** (ex : AWS Aurora Serverless) pour des coûts proportionnels à l’usage.
* **Surveiller la consommation** et ajuster les ressources régulièrement.

## La licence

PostgreSQL est publié sous la licence PostgreSQL, une licence Open Source libérale, similaire aux licences BSD ou MIT.

PostgreSQL, Système de gestion de base de données (également connu sous le nom de Postgres, anciennement Postgres95).

* Des parties du logiciel protégées par le droit d'auteur © 1996-2025, The PostgreSQL Global Development Group
* Des parties du logiciel protégées par le droit d'auteur © 1994, The Regents of the University of California

L'utilisation, la copie, la modification et la distribution de ce logiciel et de sa documentation à quelque fin que ce soit, sans frais ni accord écrit, sont autorisées par les présentes, sous réserve que la mention de droit d'auteur ci-dessus, ce paragraphe et les deux paragraphes suivants figurent sur toutes les copies.

::: warning Avertissement
L'UNIVERSITÉ DE CALIFORNIE NE POURRA EN AUCUN CAS ÊTRE TENUE RESPONSABLE ENVERS QUICONQUE DES DOMMAGES DIRECTS, INDIRECTS, SPÉCIAUX, ACCESSOIRES OU CONSÉCUTIFS, Y COMPRIS LA PERTE DE PROFITS, DÉCOULANT DE L'UTILISATION DE CE LOGICIEL ET DE SA DOCUMENTATION, MÊME SI L'UNIVERSITÉ DE CALIFORNIE A ÉTÉ AVISÉE DE LA POSSIBILITÉ DE TELS DOMMAGES.

L'UNIVERSITÉ DE CALIFORNIE DÉCLINE EXPRESSÉMENT TOUTE GARANTIE, Y COMPRIS, MAIS SANS S'Y LIMITER, LES GARANTIES IMPLICITES DE QUALITÉ MARCHANDE ET D'ADÉQUATION À UN USAGE PARTICULIER. LE LOGICIEL FOURNI CI-DESSOUS EST « EN L'ÉTAT » ET L'UNIVERSITÉ DE CALIFORNIE N'A AUCUNE OBLIGATION DE FOURNIR DE LA MAINTENANCE, DU SUPPORT, DES MISES À JOUR, DES AMÉLIORATIONS OU DES MODIFICATIONS.
:::

---

---
url: /articles/generalite.md
description: >-
  Explication des clés primaires, clé étrangères, et contrainte unique dans
  PostgreSQL
---

# Généralité

## Base de données Relationnelle

PostgreSQL est une base de données relationnelle, mais qu'est ce que cela veut dire concrètement ?

### Définition et Concepts Clés

#### Qu’est-ce qu’une base de données relationnelle ?

Une **base de données relationnelle** organise les données en **tables** (ou relations), composées de **lignes** (tuples) et de **colonnes** (attributs).

Les relations entre les tables sont établies via des **clés** (primaires, étrangères).

**Exemple :**

* Table `Clients` (id\_client, nom, email)
* Table `Commandes` (id\_commande, id\_client, date, montant)

#### Modèle Relationnel

* **Théorie** : Proposé par Edgar F. Codd en 1970.
* **Objectifs** : Éviter la redondance, garantir l’intégrité des données, et permettre des requêtes complexes.

### Principes Fondamentaux

#### ACID

Les SGBDR respectent les propriétés **ACID**:

* **Atomicité** : Une transaction est soit entièrement exécutée, soit pas du tout.
* **Cohérence** : Les données respectent les contraintes définies (ex : clés étrangères).
* **Isolation** : Les transactions concurrentes ne s’interfèrent pas.
* **Durabilité** : Les données validées persistent même en cas de panne.

#### Langage SQL

* **SQL** (Structured Query Language) est le langage standard pour interagir avec les bases relationnelles.
* **PostgreSQL** étend SQL avec des fonctionnalités avancées (JSON, requêtes récursives, etc.).

### PostgreSQL : Spécificités et Avantages

#### Pourquoi PostgreSQL ?

* **Open Source** : Gratuit et communauté active.
* **Extensible** : Support des types de données personnalisés, extensions (ex : PostGIS pour la géolocalisation).
* **Robuste** : Gestion avancée des transactions, réplication, et haute disponibilité.
* **Standard** : Très conforme à la norme SQL.

#### Fonctionnalités Clés

* **Types de données** : Texte, numérique, date/heure, JSON, réseaux (inet), géométrique, etc.
* **Index** : B-tree, Hash, GiST, GIN, BRIN pour optimiser les requêtes.
* **Partitionnement** : Améliore les performances sur de gros volumes de données.
* **Sécurité** : RBAC (rôles et permissions), chiffrement, audit.

## Clé primaire (Primary key)

### Définition

Une **clé primaire** est une colonne (ou un ensemble de colonnes) qui identifie de manière unique chaque ligne d'une table.

Elle garantit que chaque valeur est unique et non nulle.

### Caractéristiques principales

* **Unicité** : Aucune valeur dupliquée n'est autorisée.
* **Non-nullité** : La clé primaire ne peut pas contenir de valeurs NULL.
* **Une seule par table** : Une table ne peut avoir qu'une seule clé primaire (mais celle-ci peut être composée de plusieurs colonnes).

### Utilisations courantes

* **Identification unique** : Permet de distinguer chaque ligne de manière unique.
* **Relations entre tables** : Utilisée comme référence pour les clés étrangères (foreign keys) dans d'autres tables.
* **Optimisation des requêtes** : Accélère les recherches, les jointures et les tris.
* **Intégrité des données** : Empêche les doublons et les valeurs nulles, assurant la cohérence des données.

### Types de clés primaires

* **Clé primaire simple** : Une seule colonne (ex: `id` de type SERIAL ou INTEGER).
* **Clé primaire composite** : Plusieurs colonnes combinées (ex: `pays` + `code_postal`).

### Syntaxe de création

* **Lors de la création de la table** :
  ```sql
  CREATE TABLE utilisateurs (
      id SERIAL PRIMARY KEY,
      nom VARCHAR(100),
      email VARCHAR(100) UNIQUE
  );
  ```
* **Ajout après la création de la table** :
  ```sql
  ALTER TABLE utilisateurs ADD PRIMARY KEY (id);
  ```

::: info remarques
le type `SERIAL` est composé d'un type integer et d'un séquence.

si l'on sait utiliser un `bigint` il faut utiliser `BIGSERIAL`
:::

### Bonnes pratiques

* Utiliser des colonnes de type `SERIAL` ou `BIGSERIAL` pour les clés primaires auto-incrémentées.
* Les [colonnes identités](https://docs.postgresql.fr/18/ddl-identity-columns.html "Colonne identité") peuvent être utilisées comme clé primaire
* Avec PostgreSQL 18, il est possible d'utiliser `UUID7` comme [clé primaire](https://docs.postgresql.fr/18/functions-uuid.html "UUID7")
* Éviter d'utiliser des données sensibles ou sujettes à modification comme clé primaire.
* Privilégier des clés primaires courtes et simples pour optimiser les performances.

### Exemple concret

```sql
-- Table avec une clé primaire simple
CREATE TABLE clients (
    client_id SERIAL PRIMARY KEY,
    nom VARCHAR(100),
    email VARCHAR(100) UNIQUE
);

-- Table avec une clé primaire composite
CREATE TABLE commandes (
    client_id INTEGER,
    numero_commande INTEGER,
    date_commande DATE,
    PRIMARY KEY (client_id, numero_commande),
    FOREIGN KEY (client_id) REFERENCES clients(client_id)
);
```

En utilisant un colonne identité:

```sql
CREATE TABLE clients (
    client_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
    nom VARCHAR(100),
    email VARCHAR(100) UNIQUE
);
```

## Clé étrangère (Foreign Key)

Après les clés primaires, les clés étrangères sont l'autre élement essentiel d'une base de données relationnelle.

### Définition

Une **clé étrangère** est une colonne (ou un ensemble de colonnes) qui établit un lien entre les données de deux tables.

Elle fait référence à une clé primaire (ou unique) d'une autre table, assurant ainsi **l'intégrité référentielle** entre les tables.

### Caractéristiques principales

* **Intégrité référentielle** : Garantit que la valeur de la clé étrangère correspond à une valeur existante dans la table référencée.
* **Non-unicité** : Contrairement à une clé primaire, une clé étrangère peut contenir des doublons et des valeurs NULL (sauf si spécifié autrement).
* **Relations entre tables** : Permet de créer des associations entre les tables (un-à-plusieurs, plusieurs-à-plusieurs, etc.).

### Utilisations courantes

* **Lier des tables** : Établir des relations logiques entre les données de différentes tables.
* **Assurer la cohérence** : Empêcher les suppressions ou modifications qui violeraient l'intégrité des données.
* **Simplifier les jointures** : Faciliter les requêtes SQL utilisant des jointures (`JOIN`).
* **Modéliser des hiérarchies** : Représenter des structures complexes (ex: catégories et sous-catégories).

### Syntaxe de création

* **Lors de la création de la table** :
  ```sql
  CREATE TABLE commandes (
      commande_id SERIAL PRIMARY KEY,
      client_id INTEGER,
      date_commande DATE,
      FOREIGN KEY (client_id) REFERENCES clients(client_id)
  );
  ```
* **Ajout après la création de la table** :
  ```sql
  ALTER TABLE commandes ADD FOREIGN KEY (client_id) REFERENCES clients(client_id);
  ```

### Comportements en cas de suppression/mise à jour

* **`ON DELETE CASCADE`** : Supprime automatiquement les lignes dépendantes.
* **`ON DELETE SET NULL`** : Définit la clé étrangère à NULL si la ligne référencée est supprimée.
* **`ON DELETE RESTRICT`** (par défaut) : Empêche la suppression si des lignes dépendantes existent.

::: tip remarques
Il existe aussi le comportement sur le `ON UPDATE` qui permet de définir le comportement lors d'un `UPDATE` sur la primary key en lien avec la Foreign Key concernée.
:::

### Exemple concret

```sql
-- Table référencée (clé primaire)
CREATE TABLE clients (
    client_id SERIAL PRIMARY KEY,
    nom VARCHAR(100)
);

-- Table avec clé étrangère
CREATE TABLE commandes (
    commande_id SERIAL PRIMARY KEY,
    client_id INTEGER,
    date_commande DATE,
    FOREIGN KEY (client_id) REFERENCES clients(client_id) ON DELETE CASCADE
);
```

### Bonnes pratiques

* **Nommage clair** : Utiliser des noms de colonnes explicites pour les clés étrangères (ex: `client_id` plutôt que `id_client`).
* **Indexation** : Créer un index sur les colonnes de clé étrangère pour améliorer les performances des jointures.
* **Gestion des contraintes** : Choisir le comportement (`CASCADE`, `SET NULL`, etc.) en fonction des besoins métiers.

## Contrainte unique

### Définition

Une **contrainte UNIQUE** garantit que toutes les valeurs d'une colonne (ou d'un groupe de colonnes) sont distinctes dans une table.

Elle empêche les doublons, mais autorise les valeurs NULL (sauf si la colonne est aussi marquée `NOT NULL`).

### Caractéristiques principales

* **Unicité** : Aucune valeur dupliquée n'est autorisée (sauf NULL).
* **Applicable à une ou plusieurs colonnes** : Peut être définie sur une seule colonne ou sur un groupe de colonnes.
* **Différence avec une clé primaire** : Une table peut avoir plusieurs contraintes UNIQUE, mais une seule clé primaire.

### Utilisations courantes

* **Éviter les doublons** : Par exemple, pour des adresses e-mail, des numéros de téléphone ou des identifiants utilisateur.
* **Garantir l'intégrité des données** : Assurer que certaines valeurs restent uniques dans la base de données.
* **Améliorer les performances** : Les colonnes avec une contrainte UNIQUE sont souvent indexées automatiquement, ce qui accélère les recherches.

### Syntaxe de création

* **Lors de la création de la table** :
  ```sql
  CREATE TABLE utilisateurs (
      id SERIAL PRIMARY KEY,
      email VARCHAR(100) UNIQUE,  -- Contrainte UNIQUE sur une colonne
      nom_utilisateur VARCHAR(50)
  );
  ```
* **Sur un groupe de colonnes** :
  ```sql
  CREATE TABLE inscriptions (
      id SERIAL PRIMARY KEY,
      utilisateur_id INTEGER,
      evenement_id INTEGER,
      UNIQUE (utilisateur_id, evenement_id)  -- Contrainte UNIQUE sur plusieurs colonnes
  );
  ```
* **Ajout après la création de la table** :
  ```sql
  ALTER TABLE utilisateurs ADD UNIQUE (email);
  ```

### Exemple concret

```sql
-- Table avec une contrainte UNIQUE sur une colonne
CREATE TABLE clients (
    client_id SERIAL PRIMARY KEY,
    email VARCHAR(100) UNIQUE,
    telephone VARCHAR(20)
);

-- Table avec une contrainte UNIQUE sur plusieurs colonnes
CREATE TABLE reservations (
    reservation_id SERIAL PRIMARY KEY,
    client_id INTEGER,
    chambre_id INTEGER,
    date_debut DATE,
    date_fin DATE,
    UNIQUE (chambre_id, date_debut, date_fin)  -- Empêche les réservations en double pour la même chambre aux mêmes dates
);
```

::: warning
Ceci est un exemple très simpliste, qui ne tient pas compte des chevauchements de dates, si vous souhaitez traiter les chevauchements,
il faudra utiliser l'opérateur [OVERLAPS](https://docs.postgresql.fr/18/functions-datetime.html#FUNCTIONS-DATETIME "Opérateur OVERLAPS")
:::

### Bonnes pratiques

* **Utiliser des noms explicites** : Pour les contraintes UNIQUE, surtout si elles sont définies sur plusieurs colonnes.
* **Éviter les contraintes redondantes** : Si une colonne est déjà une clé primaire, elle est implicitement UNIQUE.
* **Indexation automatique** : PostgreSQL crée automatiquement un index pour chaque contrainte UNIQUE, ce qui améliore les performances des requêtes.

## Articles divers

* [Les processus de PostgreSQL](http://www.dalibo.org/glmf112_les_processus_de_postgresql)
* [PostgreSQL et ses journaux de transactions](https://public.dalibo.com/archives/publications/glmf108_postgresql_et_ses_journaux_de_transactions.pdf)
* [Utilisation de Psql](http://laetitia-avrot.blogspot.fr/2011/04/psql.html)

---

---
url: /articles/indexes.md
description: Cette page décrit l'utilisation des diféfrents index dans PostgreSQL
---

# Les Index

## Les types d'index

| Type d’index   | Description | Cas d’usage typique |
|----------------|-------------|---------------------|
| B-tree | Structure équilibrée par défaut, idéale pour les requêtes d’égalité et de plage. | Clés primaires, colonnes fréquemment interrogées avec `=`, `>`, `<`, `BETWEEN`. |
| Hash | Basé sur une fonction de hachage, très rapide pour les recherches d’égalité exacte. | Colonnes utilisées uniquement avec `=` (pas de tri ou de plage). |
| GiST | Index généralisé pour les recherches, supporte les opérateurs personnalisés. | Données géométriques, texte en plein texte, types personnalisés.                  |
| SP-GiST | Variante de GiST pour les données non équilibrées (arbres de suffixes, etc.). | Données hiérarchiques, adresses IP, types de données non structurées.              |
| GIN | Inversé par rapport à GiST, efficace pour les valeurs composites (tableaux, JSON, texte). | Colonnes contenant des tableaux, documents JSON, recherche de mots-clés. |
| BRIN | Index minimaliste pour les tables très grandes et ordonnées physiquement. | Tables volumineuses avec un ordre naturel (ex : données temporelles). |
| Bloom | Filtre probabiliste pour réduire le nombre de lignes à scanner. | Tables avec de nombreuses colonnes interrogées de manière aléatoire. |

## Index B-tree

```sql
-- Création d'une table utilisateurs
CREATE TABLE utilisateurs (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(100),
    email VARCHAR(100),
    date_inscription TIMESTAMP
);

-- Création d'un index B-tree sur la colonne 'email'
CREATE INDEX idx_utilisateurs_email ON utilisateurs (email);

-- Création d'un index B-tree sur plusieurs colonnes (index composite)
CREATE INDEX idx_utilisateurs_nom_email ON utilisateurs (nom, email);
```

Explications:

* `CREATE INDEX idx_utilisateurs_email ON utilisateurs (email);` crée un index B-tree sur la colonne email.
* PostgreSQL utilise B-tree par défaut, donc tu n’as pas besoin de préciser USING btree.
* Les index composites (sur plusieurs colonnes) sont utiles pour les requêtes qui filtrent sur plusieurs champs.

## Index Hash

Ci dessous quelques exemples d’utilisation des **index HASH** sous PostgreSQL, avec des cas concrets et des bonnes pratiques:

### Création d’un index HASH sur une colonne simple

Supposons une table `clients` avec une colonne `email` souvent utilisée dans des requêtes de type `WHERE email = '...'`.

```sql
CREATE INDEX idx_clients_email_hash ON clients USING HASH (email);
```

::: tip Utilité
L’index HASH est très efficace pour les recherches d’égalité (`=`), mais pas pour les comparaisons de plage (`>`, `<`, `BETWEEN`).
:::

### Utilisation dans une requête

L’index sera automatiquement utilisé par le planificateur de requêtes si la condition est une égalité.

```sql
SELECT * FROM clients WHERE email = 'client@example.com';
```

::: tip Remarque
PostgreSQL utilise l’index HASH uniquement pour les opérateurs `=` et `IN` (si les valeurs sont constantes).
:::

### Index HASH sur plusieurs colonnes

Vous pouvez créer un index HASH sur plusieurs colonnes, mais il ne sera utilisé que si toutes les colonnes sont spécifiées dans la condition.

```sql
CREATE INDEX idx_clients_nom_prenom_hash ON clients USING HASH (nom, prenom);
```

**Exemple de requête utilisant l’index** :

```sql
SELECT * FROM clients WHERE nom = 'Dupont' AND prenom = 'Jean';
```

### Cas d’usage typique : tables de jointure

Les index HASH sont souvent utilisés pour les colonnes de jointure, surtout si les valeurs sont uniformément distribuées.

```sql
CREATE INDEX idx_commandes_client_id_hash ON commandes USING HASH (client_id);
```

**Exemple de jointure** :

```sql
SELECT c.nom, co.montant
FROM clients c
JOIN commandes co ON c.id = co.client_id
WHERE co.client_id = 123;
```

### Limites et bonnes pratiques

* **Pas de tri** : Les index HASH ne permettent pas de trier les résultats (`ORDER BY`).
* **Pas de recherche de plage** : Ils ne sont pas adaptés pour `>`, `<`, `BETWEEN`.
* **Maintenance** : Les index HASH doivent être recréés après un `VACUUM FULL` ou une réorganisation majeure de la table.
* **PostgreSQL 10+** : Avant PostgreSQL 10, les index HASH n’étaient pas persistants après un redémarrage du serveur.

### Vérification de l’utilisation de l’index

Pour vérifier si PostgreSQL utilise bien votre index HASH, utilisez `EXPLAIN ANALYZE` :

```sql
EXPLAIN ANALYZE SELECT * FROM clients WHERE email = 'client@example.com';
```

::: tip Résultat attendu
Si l’index est utilisé, vous verrez une ligne comme `Index Scan using idx_clients_email_hash on clients`.
:::

### Quand ne pas utiliser un index HASH ?

* Si vous avez besoin de recherches de plage ou de tri.
* Si la colonne a une faible cardinalité (peu de valeurs distinctes).
* Si vous utilisez souvent des opérateurs autres que `=`.

## Index GIST

Ci-dessous des exemples concrets d’utilisation des **index GiST** (Generalized Search Tree) sous PostgreSQL, avec des cas d’usage typiques et des bonnes pratiques.

### Index GiST pour les types géométriques (PostGIS)

L’usage le plus courant des index GiST est pour les requêtes spatiales avec l’extension **PostGIS**.

### Exemple : Table avec des points géographiques

```sql
CREATE EXTENSION postgis;
CREATE TABLE lieux (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(100),
    position GEOMETRY(Point, 4326)
);

-- Création d'un index GiST sur la colonne géométrique
CREATE INDEX idx_lieux_position_gist ON lieux USING GIST(position);
```

**Requête utilisant l’index** :

```sql
-- Trouver les lieux à moins de 10 km d'un point donné
SELECT nom
FROM lieux
WHERE ST_DWithin(position, ST_SetSRID(ST_MakePoint(2.3522, 48.8566), 4326), 10000);
```

::: info
L’index GiST accélère les calculs de distance et les intersections spatiales.
:::

### Index GiST pour les types de données textuels (recherche full-text)

GiST peut aussi être utilisé pour la recherche full-text, bien que GIN soit souvent plus efficace.

```sql
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    contenu TEXT
);
-- Création d'un index GiST pour la recherche full-text
CREATE INDEX idx_documents_contenu_gist ON documents USING GIST(to_tsvector('french', contenu));
```

**Requête utilisant l’index** :

```sql
SELECT id, contenu
FROM documents
WHERE to_tsvector('french', contenu) @@ to_tsquery('french', 'PostgreSQL & index');
```

::: info
L’index GiST permet d’accélérer les recherches de mots-clés.
:::

### Index GiST pour les types de données personnalisés

GiST permet d’indexer des types de données personnalisés, comme des intervalles, des réseaux, etc.

#### Exemple : Index sur des intervalles de dates

```sql
CREATE TABLE reservations (
    id SERIAL PRIMARY KEY,
    periode TSRANGE
);
-- Création d'un index GiST sur un type intervalle
CREATE INDEX idx_reservations_periode_gist ON reservations USING GIST(periode);
```

**Requête utilisant l’index** :

```sql
-- Trouver les réservations qui chevauchent une période donnée
SELECT id
FROM reservations
WHERE periode && '[2025-09-01, 2025-09-30]'::TSRANGE;
```

::: info
L’index GiST accélère les tests de chevauchement (`&&`), de contenu (`@>`), etc.
:::

### Index GiST pour les types de données géométriques natifs

Même sans PostGIS, PostgreSQL supporte des types géométriques de base.

```sql
CREATE TABLE formes (
    id SERIAL PRIMARY KEY,
    rectangle BOX
);
-- Création d'un index GiST sur un type BOX
CREATE INDEX idx_formes_rectangle_gist ON formes USING GIST(rectangle);
```

**Requête utilisant l’index** :

```sql
-- Trouver les rectangles qui contiennent un point donné
SELECT id
FROM formes
WHERE rectangle @> '(10,10)'::POINT;
```

### Vérification de l’utilisation de l’index GiST

Pour vérifier si PostgreSQL utilise bien votre index GiST, utilisez `EXPLAIN ANALYZE`:

```sql
EXPLAIN ANALYZE
SELECT * FROM lieux
WHERE ST_DWithin(position, ST_SetSRID(ST_MakePoint(2.3522, 48.8566), 4326), 10000);
```

::: info
Cherchez `Index Scan using idx_lieux_position_gist` dans le plan d’exécution.
:::

### Quand utiliser GiST plutôt que GIN ou SP-GiST ?

* `GiST` : Idéal pour les données géométriques, les intervalles, les recherches de chevauchement.
* `GIN` : Mieux adapté pour les recherches full-text, les tableaux, les données composites.
* `SP-GiST` : Utile pour les données hiérarchiques ou les recherches de préfixe.

## Index GIN

Voici des exemples concrets d’utilisation des **index GIN** (Generalized Inverted Index) sous PostgreSQL, avec des cas d’usage typiques et des bonnes pratiques.

### Index GIN pour les colonnes de type tableau (ARRAY)

Les index GIN sont très efficaces pour rechercher des valeurs dans des colonnes de type tableau.

#### Exemple : Table avec un tableau de tags

```sql
CREATE TABLE articles (
    id SERIAL PRIMARY KEY,
    titre VARCHAR(255),
    tags TEXT[]
);
-- Création d'un index GIN sur la colonne tags
CREATE INDEX idx_articles_tags_gin ON articles USING GIN(tags);
```

**Requêtes utilisant l’index** :

```sql
-- Trouver les articles qui ont le tag 'postgresql'
SELECT * FROM articles WHERE 'postgresql' = ANY(tags);

-- Trouver les articles qui ont tous les tags 'postgresql' ET 'index'
SELECT * FROM articles WHERE tags @> ARRAY['postgresql', 'index'];

-- Trouver les articles qui ont au moins un des tags 'postgresql' OU 'base de données'
SELECT * FROM articles WHERE tags && ARRAY['postgresql', 'base de données'];
```

::: info
L’index GIN accélère les recherches de valeurs dans les tableaux, surtout pour les opérateurs `@>`, `&&` et `= ANY`.
:::

### Index GIN pour la recherche full-text

GIN est souvent utilisé pour la recherche full-text, car il est plus rapide que GiST pour ce type de requête.

```sql
CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    contenu TEXT
);
-- Création d'un index GIN pour la recherche full-text
CREATE INDEX idx_documents_contenu_gin ON documents USING GIN(to_tsvector('french', contenu));
```

**Requêtes utilisant l’index** :

```sql
-- Trouver les documents contenant les mots 'postgresql' ET 'index'
SELECT id, contenu
FROM documents
WHERE to_tsvector('french', contenu) @@ to_tsquery('french', 'postgresql & index');

-- Trouver les documents contenant la phrase 'optimisation des requêtes'
SELECT id, contenu
FROM documents
WHERE to_tsvector('french', contenu) @@ plainto_tsquery('french', 'optimisation des requêtes');
```

::: info
L’index GIN est très efficace pour les recherches de mots-clés et les requêtes booléennes.
:::

### Index GIN pour les colonnes de type JSON/JSONB

GIN est le type d’index le plus performant pour les requêtes sur des colonnes JSONB, surtout pour rechercher des clés ou des valeurs imbriquées.

```sql
CREATE TABLE produits (
    id SERIAL PRIMARY KEY,
    nom VARCHAR(255),
    attributs JSONB
);
-- Création d'un index GIN sur la colonne JSONB
CREATE INDEX idx_produits_attributs_gin ON produits USING GIN(attributs);
```

**Requêtes utilisant l’index** :

```sql
-- Trouver les produits dont l'attribut 'couleur' est 'bleu'
SELECT * FROM produits WHERE attributs @> '{"couleur": "bleu"}';

-- Trouver les produits qui ont une clé 'prix' dans leurs attributs
SELECT * FROM produits WHERE attributs ? 'prix';

-- Trouver les produits dont la valeur de la clé 'prix' est supérieure à 100
SELECT * FROM produits WHERE attributs->>'prix'::NUMERIC > 100;
```

::: info
→ L’index GIN accélère les recherches de clés, de valeurs et les tests de contenu dans les JSONB.
:::

### Index GIN pour les colonnes de type composite ou personnalisé

GIN peut aussi être utilisé pour des types de données composites ou personnalisés, comme les `hstore` ou les `ltree`.

#### Exemple avec hstore

```sql
CREATE EXTENSION hstore;
CREATE TABLE profils (
    id SERIAL PRIMARY KEY,
    infos HSTORE
);
-- Création d'un index GIN sur la colonne hstore
CREATE INDEX idx_profils_infos_gin ON profils USING GIN(infos);
```

**Requêtes utilisant l’index** :

```sql
-- Trouver les profils dont la clé 'langue' a la valeur 'français'
SELECT * FROM profils WHERE infos @> 'langue=>français';

-- Trouver les profils qui ont une clé 'pays'
SELECT * FROM profils WHERE infos ? 'pays';
```

### Vérification de l’utilisation de l’index GIN

Pour vérifier si PostgreSQL utilise bien votre index GIN, utilisez `EXPLAIN ANALYZE` :

```sql
EXPLAIN ANALYZE
SELECT * FROM articles WHERE tags @> ARRAY['postgresql', 'index'];
```

::: tip
Cherchez `Bitmap Heap Scan` ou `Index Scan` avec le nom de votre index GIN dans le plan d’exécution.
:::

### Quand utiliser GIN plutôt que GiST ou SP-GiST ?

* `GIN` : Idéal pour les tableaux, les JSONB, la recherche full-text, les données composites.
* `GiST` : Mieux adapté pour les données géométriques, les intervalles, les recherches de chevauchement.
* `SP-GiST` : Utile pour les données hiérarchiques ou les recherches de préfixe.

## Index BRIN

Voici des exemples concrets d’utilisation des **index BRIN** (Block Range INdex) sous PostgreSQL, avec des cas d’usage typiques, des bonnes pratiques et des exemples de requêtes.

### Qu’est-ce qu’un index BRIN ?

* **BRIN** est un type d’index conçu pour les **très grandes tables** où les données sont **physiquement ordonnées** selon une colonne (par exemple, une colonne de type date, timestamp, ou série numérique).
* Il est **très compact** et **rapide à maintenir**, mais moins précis qu’un B-tree pour les recherches ponctuelles.
* Idéal pour les tables où les données sont **insérées dans l’ordre** (logs, séries temporelles, etc.).

### Création d’un index BRIN sur une colonne de type timestamp

Supposons une table de logs où les entrées sont toujours insérées par ordre chronologique :

```sql
CREATE TABLE logs (
    id BIGSERIAL PRIMARY KEY,
    date_log TIMESTAMPTZ NOT NULL,
    message TEXT
);

-- Création d'un index BRIN sur la colonne date_log
CREATE INDEX idx_logs_date_brin ON logs USING BRIN(date_log);
```

::: tip Pourquoi BRIN ?

* Les logs sont toujours insérés par ordre chronologique.
* La table peut devenir très volumineuse.
* BRIN est très efficace pour les requêtes de plage sur `date_log`.
  :::

### Requêtes utilisant l’index BRIN

#### Exemple 1 : Recherche de plage de dates

```sql
-- Trouver tous les logs entre deux dates
SELECT * FROM logs WHERE date_log BETWEEN '2025-09-01' AND '2025-09-16';
```

::: info
L’index BRIN permet de sauter rapidement les blocs de données qui ne contiennent pas de logs dans cette plage.
:::

#### Exemple 2 : Recherche de logs récents

```sql
-- Trouver les logs des dernières 24 heures
SELECT * FROM logs WHERE date_log > NOW() - INTERVAL '24 hours';
```

::: info
BRIN est très efficace pour ce type de requête sur des données ordonnées.
:::

### Création d’un index BRIN sur une colonne numérique ordonnée

Exemple avec une table de mesures de capteurs, où les données sont insérées par ordre de `timestamp` et de `valeur` :

```sql
CREATE TABLE mesures (
    id BIGSERIAL PRIMARY KEY,
    timestamp TIMESTAMPTZ NOT NULL,
    valeur DOUBLE PRECISION NOT NULL
);
-- Création d'un index BRIN sur la colonne timestamp
CREATE INDEX idx_mesures_timestamp_brin ON mesures USING BRIN(timestamp);
```

**Requête utilisant l’index** :

```sql
-- Trouver les mesures entre deux timestamps
SELECT * FROM mesures
WHERE timestamp BETWEEN '2025-09-01 00:00:00' AND '2025-09-01 12:00:00';
```

### Création d’un index BRIN multi-colonnes

Vous pouvez créer un index BRIN sur plusieurs colonnes, si elles sont corrélées et ordonnées ensemble.

```sql
-- Création d'un index BRIN sur deux colonnes
CREATE INDEX idx_mesures_timestamp_valeur_brin ON mesures USING BRIN(timestamp, valeur);
```

::: warning Remarque
BRIN est surtout efficace si les colonnes sont **physiquement corrélées** dans l’ordre d’insertion.
:::

### Vérification de l’utilisation de l’index BRIN

Pour vérifier si PostgreSQL utilise bien votre index BRIN, utilisez `EXPLAIN ANALYZE` :

```sql
EXPLAIN ANALYZE
SELECT * FROM logs
WHERE date_log BETWEEN '2025-09-01' AND '2025-09-16';
```

::: info
Cherchez `Index Scan using idx_logs_date_brin` dans le plan d’exécution.
:::

### Quand utiliser BRIN plutôt que B-tree ou GiST ?

| Critère                | BRIN           | B-tree          | GiST          |
|------------------------|----------------|-----------------|---------------|
| Données ordonnées      | ✅ Idéal       | ⚠️ Possible    | ❌ Non        |
| Taille de l’index      | Très compact   | Volumineux      | Compact       |
| Recherche ponctuelle   | ❌ Peu précis  | ✅ Très précis | ⚠️ Variable   |
| Recherche de plage     | ✅ Très rapide | ✅ Rapide      | ⚠️ Variable   |
| Maintenance            | Très rapide     | Lente          | Rapide        |

::: info Cas d’usage typiques pour BRIN

* Tables de logs, séries temporelles, données IoT.
* Tables où les données sont toujours insérées dans l’ordre (par exemple, par date).
* Tables très volumineuses où la taille de l’index est un critère important.
  :::

### Bonnes pratiques avec BRIN

* **Ordonner les données** : BRIN est efficace si les données sont physiquement ordonnées selon la colonne indexée.
* **Éviter les mises à jour aléatoires** : BRIN est optimisé pour les insertions séquentielles.
* **Utiliser `pages_per_range`** : Vous pouvez ajuster la taille des blocs indexés pour optimiser les performances (par défaut, 128 pages par bloc).

```sql
CREATE INDEX idx_logs_date_brin ON logs USING BRIN(date_log) WITH (pages_per_range = 64);
```

## Use the index Luke

Le site [Use the index,
Luke](http://use-the-index-luke.com/fr/sql/preface) décrit les
problématiques du SQL, et vous donnent des pistes pour créer des indexes
efficaces en fonctions de vos cas de figures.

## Articles divers

* [Retarder la vérification des
  contraintes](https://blog.anayrat.info/2016/08/13/postgresql-retarder-la-verification-des-contraintes/)
* [Index BRIN --
  Performances](https://blog.anayrat.info/2016/04/21/index-brin-performances/)

---

---
url: /articles/maintenance.md
description: >-
  Cette page regroupe des séries d'article sur PostgreSQL en français concernant
  les opérations de maintenance de la base de données
---

# Maintenance

Voici les principales opérations de maintenance possibles sous **PostgreSQL** pour assurer la performance,
la fiabilité et la durabilité de votre base de données:

## VACUUM

* **But** : Nettoyer les lignes mortes (tuples) laissées par les mises à jour ou suppressions, libérer de l’espace et éviter le gonflement des tables.
* **Variantes** :
  * `VACUUM` : Nettoyage standard.
  * `VACUUM FULL` : Réorganise physiquement la table, plus lent mais plus efficace.
  * `VACUUM ANALYZE` : Nettoie et met à jour les statistiques pour l’optimiseur de requêtes.

## ANALYZE

* **But** : Mettre à jour les statistiques utilisées par l’optimiseur de requêtes pour générer des plans d’exécution optimaux.
* **Utilisation** : Souvent combiné avec `VACUUM` (`VACUUM ANALYZE`).

## REINDEX

* **But** : Reconstruire les index corrompus ou fragmentés.
* **Utilisation** : `REINDEX TABLE ma_table;` ou `REINDEX DATABASE ma_base;`

## CLUSTER

* **But** : Réorganiser physiquement une table selon un index pour améliorer les performances de lecture.
* **Utilisation** : `CLUSTER ma_table USING mon_index;`

## Maintenance des logs et archives WAL

* **But** : Gérer les fichiers de journalisation (WAL) pour la réplication et la récupération après incident.
* **Actions** :
  * Archiver les WAL (`archive_command`).
  * Nettoyer les anciens WAL (`pg_archivecleanup`).

## Gestion des connexions et verrous

* **But** : Identifier et résoudre les blocages ou connexions bloquantes.
* **Outils** :
  * `pg_stat_activity` : Voir les connexions actives.
  * `pg_locks` : Voir les verrous.

## Mise à jour des statistiques système

* **But** : Assurer que PostgreSQL dispose des informations les plus récentes sur la distribution des données.
* **Utilisation** : `ANALYZE;` ou `VACUUM ANALYZE;`

## **Gestion de l’autovacuum**

* **But** : Configurer le processus automatique de nettoyage (`autovacuum`) pour éviter les interventions manuelles.
* **Paramètres** : `autovacuum`, `autovacuum_vacuum_threshold`, etc.

## Vérification de l’intégrité des données

* **But** : Détecter les corruptions de données.
* **Outils** : `pg_checksums` (si activé), `pg_verifybackup`.

## Quand les utiliser ?

* **Régulièrement** : `VACUUM`, `ANALYZE`, surveillance des logs.
* **Après des opérations massives** : `REINDEX`, `CLUSTER`.
* **En cas de problème** : Vérification des verrous, intégrité des données.

## Articles Divers

* [Analyse du
  VACUUM](https://web.archive.org/web/20181129020959/http://blog.guillaume.lelarge.info/index.php/category/Postgresql)
* [Comment quantifier le
  maintenance\_work\_mem](https://web.archive.org/web/20181128143819/http://blog.guillaume.lelarge.info/index.php/post/2015/07/14/Comment-quantifier-le-maintenance_work_mem)
* [Liste et taille des bases, des schémas et des tables en
  postgreSQL](http://laetitia-avrot.blogspot.fr/2011/04/psql.html)

---

---
url: /articles/plangages.md
description: Listes des langages procéduraux utilisables avec la base de données PostgreSQL
---

# Langages de procédures

## Introduction

Les langages de procédures permettent d’écrire des fonctions, des déclencheurs (triggers) et des procédures stockées directement dans la base de données.

Actuellement, la distribution standard de PostgreSQL inclut quatre langages de procédures par défaut :

* [PL/pgSQL](https://docs.postgresql.fr/18/plpgsql.html "PL/pgSQL -- Langage de procédures SQL"),
* [PL/Tcl](https://docs.postgresql.fr/18/pltcl.html "PL/Tcl -- Langage de procédures Tcl"),
* [PL/Perl](https://docs.postgresql.fr/18/plperl.html "PL/Perl -- Langage de procédures Perl"),
* [PL/Python](https://docs.postgresql.fr/18/plpython.html "PL/Python -- Langage de procédures Python").

## PL/pgSQL

### Résumé

Langage procédural natif de PostgreSQL, inspiré de PL/SQL (Oracle). Il est le plus utilisé pour écrire des fonctions et des déclencheurs. PL/pgSQL permet de manipuler des données, de gérer des erreurs, et d’utiliser des structures de contrôle (boucles, conditions, etc.).

### Avantages

* Intégration parfaite avec PostgreSQL.
* Performant et optimisé.
* Support complet des fonctionnalités de PostgreSQL.

### Cas d’usage

* Logique métier complexe dans la base de données.
* Déclencheurs (triggers).
* Fonctions personnalisées.

## PL/Tcl

### Résumé

Permet d’utiliser le langage [Tcl](https://www.tcl-lang.org/ "Site web du langage TCL") (Tool Command Language) pour écrire des fonctions et des déclencheurs. Tcl est un langage de script dynamique, souvent utilisé pour des tâches d’automatisation ou de prototypage.

### Avantages

* Flexibilité et simplicité de TCL.
* Accès aux bibliothèques TCL.

### Cas d’usage

* Scripts d’automatisation.
* Traitements nécessitant des expressions régulières ou des manipulations de chaînes avancées.

## PL/Perl

### Résumé

Permet d’écrire des fonctions et des déclencheurs en [Perl](https://www.perl.org/ "Langage Perl"), un langage puissant pour le traitement de texte et les expressions régulières.

### Avantages

* Puissance de Perl pour le traitement de texte.
* Accès aux modules Perl (si autorisé).

### Cas d’usage

* Traitement de données textuelles complexes.
* Parsing et transformation de données.

## PL/Python

### Résumé

Permet d’utiliser [Python](https://www.python.org/ "Langage Python") pour écrire des fonctions et des déclencheurs. Python est un langage populaire pour sa lisibilité et sa richesse en bibliothèques.

### Avantages

* Lisibilité et simplicité de Python.
* Accès à des bibliothèques Python (si autorisé).

### Cas d’usage

* Traitements analytiques ou scientifiques.
* Intégration avec des outils externes en Python.

## PL/Lua

### Résumé

**PL/Lua** est une extension procédurale pour PostgreSQL qui permet d’écrire des **fonctions, procédures et déclencheurs (triggers) directement** en [Lua](https://www.lua.org/ "Langage Lua"). Lua est un langage de script léger, rapide et facile à intégrer, connu pour sa simplicité et sa petite empreinte mémoire.

### Avantages principaux

* **Simplicité et légèreté**: Lua est conçu pour être petit, rapide et facile à embarquer, ce qui en fait un bon choix pour des traitements légers et rapides dans la base de données.
* **Syntaxe claire**: Lua offre une syntaxe minimaliste et intuitive, avec des fonctions de première classe, une portée lexicale et des coroutines pour une gestion avancée du flux d’exécution.
* **Intégration native avec PostgreSQL**: PL/Lua permet d’accéder directement aux types de données PostgreSQL (TEXT, INT, NUMERIC, etc.) sans conversion forcée en chaîne de caractères, et supporte l’interface SPI (Server Programming Interface) pour exécuter des requêtes SQL depuis Lua.
* **Deux modes d’exécution**:
  * **pllua** (mode "trusted" ou sécurisé) : environnement restreint, idéal pour une utilisation sécurisée.
  * **plluau** (mode "untrusted" ou non sécurisé) : accès complet à l’environnement Lua, y compris le chargement de modules et l’accès à la table globale.

### Cas d’usage

* **Traitements légers et rapides**: Scripts simples, transformations de données, logiques métiers légères.
* **Utilisation de coroutines**: Pour gérer des flux d’exécution complexes ou asynchrones.
* **Prototypage rapide**: Grâce à la simplicité de Lua, idéal pour des tests ou des développements rapides.
* **Déclencheurs (triggers)**: Logique personnalisée déclenchée par des événements sur les tables.

## PL/Java

### Résumé

Permet d’écrire des fonctions et des déclencheurs en **Java**, offrant une intégration avec l’écosystème Java.

### Avantages

* Accès aux bibliothèques Java.
* Portabilité et performance.

### Cas d’usage

* Applications nécessitant une intégration avec des systèmes Java.
* Traitements lourds ou parallélisés.

## PL/R

### Résumé

Permet d’utiliser le langage [R](https://www.r-project.org/ "Langage R") pour écrire des fonctions et des déclencheurs, idéal pour l’analyse statistique et la visualisation de données.

### Avantages

* Puissance de R pour l’analyse statistique.
* Intégration avec des outils de data science.

### Cas d’usage

* Analyses statistiques avancées.
* Modélisation et visualisation de données.

## PL/V8 (JavaScript)

### Résumé

Permet d’écrire des fonctions et des déclencheurs en **JavaScript**, en utilisant le moteur V8 de Google.

### Avantages

* Familiarité de JavaScript pour les développeurs web.
* Accès à des fonctionnalités dynamiques.

### Cas d’usage

* Traitements nécessitant des logiques dynamiques ou asynchrones.
* Intégration avec des applications web.

## PL/LOLCODE

### Résumé

Langage procédural humoristique basé sur le [LOLCODE](http://www.lolcode.org/ "Langage LOLCODE"), un langage de programmation esoteric. Peu utilisé en production, mais disponible pour des démonstrations ou des projets ludiques.

### Avantages

* Originalité et aspect ludique.

### Cas d’usage

* Projets expérimentaux ou éducatifs.

## PL/Rust

### Résumé

**PL/Rust** est une extension procédurale pour PostgreSQL qui permet d’écrire des **fonctions, procédures et déclencheurs directement** en [Rust](https://rust-lang.org/fr/ "Langage Rust").

::: warning
Contrairement à la plupart des autres langages procéduraux (comme PL/pgSQL, PL/Python, etc.), les fonctions PL/Rust ne sont pas interprétées.

Elles sont **compilées en code machine natif**, ce qui offre des performances comparables à celles du C, tout en bénéficiant des **garanties de sécurité mémoire de Rust** (pas de fuites mémoire, pas de corruption de mémoire, etc.).
:::

### Avantages

* **Performance** : Les fonctions sont compilées en code natif, ce qui permet d’atteindre des performances optimales, proches de celles du C.
* **Sécurité** : Rust garantit la sécurité mémoire à la compilation, réduisant les risques de plantage ou de corruption de la base de données. PL/Rust est considéré comme un langage "trusted" (de confiance) sur les architectures x86\_64 et aarch64, sous certaines conditions.
* **Accès à l’écosystème Rust** : Possibilité d’utiliser des bibliothèques (crates) Rust, sous réserve de compatibilité avec l’environnement PostgreSQL.
* **Intégration avec PostgreSQL** : Accès complet à l’interface de programmation serveur (SPI) de PostgreSQL, permettant d’exécuter des requêtes dynamiques, des requêtes préparées et des curseurs.

### Cas d’usage

* **Fonctions critiques en termes de performance** : Calculs intensifs, traitements de données complexes, où la vitesse d’exécution est cruciale.
* **Sécurité renforcée** : Environnements où la sécurité mémoire est une priorité (ex. : bases de données exposées à des utilisateurs non privilégiés).
* **Intégration avec des outils Rust** : Réutilisation de code Rust existant ou utilisation de bibliothèques Rust pour des traitements spécifiques.

## PL/Proxy

### Résumé

Permet de créer des fonctions qui appellent des procédures distantes, utile pour la répartition de charge ou l’appels de fonctions sur d’autres serveurs.

### Avantages

* Appels de procédures distantes.
* Partitionnement de données.

### Cas d’usage

* Architectures distribuées.
* Appels de fonctions sur des bases de données distantes.

## SQL (Langage de requête standard)

### Résumé

Bien que ce ne soit pas un langage procédural à part entière, PostgreSQL permet d’écrire des fonctions en **SQL pur**. Ces fonctions sont limitées aux requêtes SQL et ne supportent pas les structures de contrôle avancées.

### Avantages

* Simplicité pour des requêtes basiques.
* Portabilité.

### Cas d’usage

* Fonctions simples de requêtage.
* Agrégations ou calculs basiques.

## Comment activer un langage procédural ?

Pour utiliser un langage procédural, il faut d’abord l’activer dans la base de données avec la commande :

```sql
CREATE EXTENSION IF NOT EXISTS pl<langage>;
```

Exemple pour PL/pgSQL :

```sql
CREATE EXTENSION IF NOT EXISTS plpgsql;
```

## **Quel langage choisir ?**

* **PL/pgSQL**: Pour la plupart des cas, surtout si vous restez dans l’écosystème PostgreSQL.
* **PL/Python** ou **PL/Perl**: Pour des traitements textuels ou analytiques avancés.
* **PL/Java** ou **PL/R**: Pour des intégrations spécifiques avec Java ou R.
* **PL/V8**: Pour des développeurs familiers avec JavaScript.
* **PL/Rust**: Pour des besoins de performances maximales et de sécurité mémoire dans vos fonctions PostgreSQL.

---

---
url: /articles/replication.md
description: >-
  Cette page regroupe des séries d'article sur PostgreSQL en français concernant
  la réplication de la base de données
---

# Réplication

## Introduction

La réplication de base de données consiste à copier électroniquement et
fréquemment des données d'une base de données d'un ordinateur ou d'un
serveur vers une base de données d'un autre, de sorte que tous les
utilisateurs partagent le même niveau d'informations.

Le résultat est une base de données distribuée dans laquelle les
utilisateurs peuvent accéder r apidement aux données pertinentes pour
leurs tâches sans interférer avec le travail des autres. De nombreux
éléments contribuent au processus global de création et de gestion de la
réplication de base de données.

Voici les principales méthodes de **réplication** disponibles sous **PostgreSQL**, classées par type et usage :

## Réplication Physique (binaire)

* **Fonctionnement** : Copie exacte des fichiers de données (WAL - Write-Ahead Log).
* **Méthodes** :
  * **Réplication continue (Streaming Replication)** :
    * Le serveur principal envoie les WAL en temps réel aux réplicas.
    * Utilisé pour la haute disponibilité et la tolérance aux pannes.
  * **Réplication par archive (Log Shipping)** :
    * Les WAL sont archivés et restaurés sur le réplica.
    * Moins temps réel, mais plus simple à mettre en place.

## Réplication Logique

* **Fonctionnement** : Copie des données au niveau logique (tables, lignes).
* **Méthodes** :
  * **Publication/Souscription (Publishing/Subscribing)** :
    * Permet de répliquer des tables spécifiques entre bases, même de versions différentes.
    * Idéal pour la synchronisation partielle ou la migration.
  * **Extensions tierces** :
    * `pglogical`, `Londiste`, `Bucardo` : pour des besoins avancés ou multi-maîtres.

## Réplication Multi-Maître

* **Fonctionnement** : Plusieurs nœuds acceptent les écritures.
* **Solutions** :
  * **PostgreSQL natif** : Limité, nécessite des outils externes.
  * **Extensions** : `BDR`, `Citus` (pour le sharding et la réplication distribuée).
  * **Solutions externes** : `pgpool-II` (avec gestion de conflit).

## Réplication par Trigger

* **Fonctionnement** : Utilisation de triggers pour copier les modifications vers une autre base.
* **Avantages/Inconvénients** : Flexible mais complexe et moins performant.

## Réplication via Outils Externes

* **Exemples** :
  * `pgpool-II` : Gestion de pool de connexions et réplication.
  * `Slony` : Réplication asynchrone multi-maître.
  * `Barman` : Sauvegarde et restauration, utile pour la réplication de secours.

## Résumé des cas d’usage

| Type de réplication         | Cas d’usage principal                       | Complexité |
|-----------------------------|---------------------------------------------|------------|
| Streaming Replication       | Haute disponibilité, failover               | Moyenne    |
| Log Shipping                | Sauvegarde à distance, PRA                  | Faible     |
| Publication/Souscription    | Synchronisation partielle, migration        | Faible     |
| Multi-Maître                | Écritures distribuées, tolérance aux pannes | Élevée     |
| Trigger                     | Synchronisation personnalisée               | Élevée     |

## Articles DIvers

* [PostgreSQL 10 et la réplication logique -- Fonctionnement](https://blog.anayrat.info/2017/07/29/postgresql-10-et-la-replication-logique-fonctionnement/)
* [PostgreSQL 10 et la réplication logique -- Mise en oeuvre](https://blog.anayrat.info/2017/08/05/postgresql-10-et-la-replication-logique-mise-en-oeuvre/)
* [PostgreSQL 10 et la réplication logique -- Restrictions](https://blog.anayrat.info/2017/08/27/postgresql-10-et-la-replication-logique-restrictions/)
* [PostgreSQL et la réplication logique](http://www.loxodata.com/post/replicationlogique/)

---

---
url: /articles/sauvegarde.md
description: >-
  Cette page regroupe des séries d'article sur PostgreSQL en français concernant
  la sauvegarde et la restauration de la base de données
---

# Sauvegarde et restauration

## Introduction

La sauvegarde et la restauration font référence aux technologies et
pratiques permettant de réaliser des copies périodiques de données et
d'applications sur un périphérique secondaire distinct, puis
d'utiliser ces copies pour récupérer les données et les applications,
ainsi que les opérations commerciales dont elles dépendent.

La sauvegarde et la restauration sont utilisées si les données et les
applications d'origine sont perdues ou endommagées en raison d'une
panne de courant, d'une cyberattaque, d'une erreur humaine, d'une
catastrophe ou de tout autre événement imprévu.

## Sous PostgreSQL

Sous PostgreSQL par défaut il existe 3 type de sauvegarde.

* Sauvegarde de type SQL (Dump)
* Sauvegarde au niveau du système de fichier
* Sauvegarde en archivage continue

### Sauvegarde

La sauvegarde SQL (également appelé Dump) se réalise avec le programme
founit en standard
[pg\_dump](https://docs.postgresql.fr/current/app-pgdump.html).

### Restauration

la restauration de cette sauvegarde se fera avec le programme
[pg\_restore](https://docs.postgresql.fr/current/app-pgrestore.html)

## pg\_dump – Sauvegarde de bases PostgreSQL

### Description

pg\_dump est un outil en ligne de commande qui permet de sauvegarder une base de données PostgreSQL.

Avantages :

* Ne bloque pas les autres connexions.
* Plusieurs formats de sortie possibles.
* Permet de sauvegarder tout ou partie d’une base.

### Formats de sorties

| Format | Description | Extension |
|:------:|:------------|:---------:|
| SQL | Script SQL lisible et portable. | .sql |
| Custom | Format binaire optimisé pour pg\_restore. | .dump |
| Directory | Un fichier par table, idéal pour les grosses BDD. | /dir/ |
| Tar | Format binaire compressé, compatible avec tar. | .tar |

### Options courantes

| Option | Description |
|--------|-------------|
| -U utilisateur | Nom de l’utilisateur PostgreSQL |
| -h hôte | Adresse du serveur PostgreSQL |
| -p port | Port de connexion (par défaut : 5432) |
| -d base | Nom de la base à sauvegarder |
| -F format | Format de sortie (p, c, d, t) |
| -f fichier | Fichier de sortie |
| -W | Demande le mot de passe |
| --clean | Nettoie les objets avant recréation |
| --if-exists | Utilise IF EXISTS pour éviter les erreurs |

### Exemples d’utilisation

#### Sauvegarde complète en SQL

```shell
pg_dump -U mon_user -h localhost -p 5432 -d ma_base -F p -f sauvegarde.sql
```

#### Sauvegarde en format custom (binaire)

```shell
pg_dump -U mon_user -d ma_base -F c -f sauvegarde.dump
```

#### Sauvegarde en format directory

```shell
pg_dump -U mon_user -d ma_base -F d -f sauvegarde_dir/
```

#### Sauvegarde avec compression

```shell
pg_dump -U mon_user -d ma_base -F c -f - | gzip > sauvegarde.dump.gz
```

#### Sauvegarde d’un schéma spécifique

```shell
pg_dump -U mon_user -d ma_base -n mon_schema -f schema.sql
```

#### Sauvegarde des données uniquement

```shell
pg_dump -U mon_user -d ma_base -a -f données.sql
```

## pg\_restore – Restauration de bases PostgreSQL

### Description

pg\_restore permet de restaurer une base de données PostgreSQL à partir d’un fichier créé par pg\_dump (surtout en formats custom, directory ou tar).

Avantages :

* Restauration sélective (tables, schémas, etc.).
* Contrôle fin sur les options de restauration.
* Optimisé pour les gros volumes.

#### Formats supportés

| Format | Description |
|:------:|-------------|
| Custom | Format binaire optimisé pour pg\_restore |
| Directory | Un fichier par table, idéal pour les grosses BDD |
| Tar | Format binaire compressé, compatible avec tar |

::: warning
Ne fonctionne pas avec les sauvegardes en format SQL pur (.sql)

utiliser la commande [psql](https://docs.postgresql.fr/17/app-psql.html "terminal interactif PostgreSQL") dans ce cas
:::

#### Options courantes

| Option | Description |
|:------:|-------------|
| -U utilisateur | Nom de l’utilisateur PostgreSQL |
| -h hôte | Adresse du serveur PostgreSQL |
| -p port | Port de connexion (par défaut : 5432) |
| -d base | Base cible pour la restauration |
| -F format | Format de la sauvegarde (c, d, t) |
| -j nombre | Nombre de jobs parallèles (accélère la restauration) |
| --clean | Nettoie les objets avant recréation |
| --if-exists | Utilise IF EXISTS pour éviter les erreurs |
| --no-owner | Ignore les propriétaires des objets |
| --no-privileges | Ne restaure pas les permissions |
| -v | Mode verbeux |
| -l | Liste le contenu de la sauvegarde |

### Exemples d’utilisation

#### Restauration complète (format custom)

```shell
pg_restore -U mon_user -d ma_base -F c sauvegarde.dump
```

#### Restauration avec jobs parallèles (4 jobs)

```shell
pg_restore -U mon_user -d ma_base -j 4 -F c sauvegarde.dump
```

#### Restauration sélective (une seule table)

```shell
pg_restore -U mon_user -d ma_base -t ma_table -F c sauvegarde.dump
```

#### Restauration en mode "clean" (nettoyage avant)

```shell
pg_restore -U mon_user -d ma_base --clean --if-exists -F c sauvegarde.dump
```

#### Lister le contenu d’une sauvegarde

```shell
pg_restore -l -F c sauvegarde.dump
```

#### Restauration depuis un format directory

```shell
pg_restore -U mon_user -d ma_base -F d sauvegarde_dir/
```

#### Depuis un script SQL

```shell
psql -U mon_user -d ma_base -f sauvegarde.sql
```

::: warning

Dans cet exemple on utilise [psql](https://docs.postgresql.fr/17/app-psql.html "terminal interactif PostgreSQL") au lieu de [pg\_restore](https://docs.postgresql.fr/17/app-pgrestore.html "terminal de restauration")
:::

## pgBackRest – Sauvegarde et Restauration PostgreSQL

### Description

[pgBackRest](https://pgbackrest.org/ "Sauvegarde et restauration PostgreSQL fiables") est un outil open source conçu pour gérer les sauvegardes fiables, performantes et automatisées des bases de données PostgreSQL.

Avantages :

* Sauvegardes incrémentielles et différentielles.
* Compression et chiffrement natifs.
* Restauration rapide et flexible (PITR, tablespaces, etc.).
* Intégration facile avec les environnements de production.
* Support des clusters et réplications.

### Concepts clés

| Concept | Description |
|:-------:|:------------|
| Full Backup | Sauvegarde complète de la base |
| Incremental Backup | Sauvegarde uniquement les changements depuis la dernière sauvegarde |
| Differential Backup | Sauvegarde les changements depuis la dernière sauvegarde complète |
| PITR | Restauration à un point précis dans le temps (Point-In-Time Recovery) |
| Stanza | Configuration logique d’une base ou d’un cluster à sauvegarder |
| Repository | Emplacement de stockage des sauvegardes (local, S3, SFTP, etc.) |

### Installation

Sur Debian/Ubuntu

```shell
sudo apt-get install pgbackrest
```

Sur RHEL/CentOS

```shell
sudo yum install pgbackrest
```

### Configuration minimale

```ini
[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
log-level-console=info

[ma_stanza]
pg1-path=/var/lib/postgresql/17/main
```

### Commandes de base

#### Initialiser une stanza

```shell
pgbackrest --stanza=ma_stanza stanza-create
```

#### Sauvegarde complète

```shell
pgbackrest --stanza=ma_stanza --type=full backup
```

#### Sauvegarde incrémentielle

```shell
pgbackrest --stanza=ma_stanza --type=incr backup
```

#### Vérifier l’état des sauvegardes

```shell
pgbackrest info
```

#### Restauration complète

```shell
pgbackrest --stanza=ma_stanza restore
```

#### Restauration PITR (Point-In-Time Recovery)

```shell
pgbackrest --stanza=ma_stanza --type=time --target="2025-09-13 12:00:00+00" restore
```

### Exemples avancés

#### Sauvegarde avec compression et chiffrement

```ini
[global]
repo1-cipher-type=aes-256-cbc
repo1-cipher-pass=mon_mot_de_passe
compress-level=3
```

#### Sauvegarde vers un repository distant (S3)

```ini
[global]
repo1-type=s3
repo1-s3-bucket=mon-bucket-pgbackrest
repo1-s3-endpoint=s3.eu-west-3.amazonaws.com
repo1-s3-region=eu-west-3
repo1-s3-key=ma_clé
repo1-s3-key-secret=ma_clé_secrète
```

#### Restauration vers un nouvel emplacement

```shell
pgbackrest --stanza=ma_stanza --pg1-path=/nouveau/chemin/data restore
```

### Documentation officielle

* [Site officiel pgBackRest](https://pgbackrest.org/ "Site officiel")
* [Guide utilisateur](https://pgbackrest.org/user-guide-index.html "Guide utilisateur en Anglais")
* [Guide des commandes en ligne](https://pgbackrest.org/command.html "Liste des commandes")
* [Guide de la configuration](https://pgbackrest.org/configuration.html "Guide de la configuration")

## Articles divers

### Sauvegarde

* [Faire une sauvegarde avec
  pgBackRest](http://laetitia-avrot.blogspot.fr/2017/02/faire-une-sauvegarde-avec-pgbackrest.html)

### Restauration

* [Restaurer avec
  pgBackRest](http://laetitia-avrot.blogspot.fr/2017/02/restaurer-avec-pgbackrest.html)

---

---
url: /articles/types.md
description: Descriptif des types de données géré par de PostgreSQL
---

# Types de données PostgreSQL

PostgreSQL propose une grande variété de types de données. Voici une liste exhaustive des principaux types disponibles, classés par catégorie.

## 1. Types numériques

| Type                | Description                                                                          | Exemple de valeur         |
|---------------------|--------------------------------------------------------------------------------------|---------------------------|
| `smallint`          | Entier sur 2 octets (plage : -32 768 à 32 767)                                       | `42`                      |
| `integer`           | Entier sur 4 octets (plage : -2 147 483 648 à 2 147 483 647)                         | `42`                      |
| `bigint`            | Entier sur 8 octets (plage : -9 223 372 036 854 775 808 à 9 223 372 036 854 775 807) | `9223372036854775807`     |
| `decimal`           | Nombre décimal exact, précision variable (ex: `decimal(10,2)`)                       | `12345678.90`             |
| `numeric`           | Équivalent à `decimal`                                                               | `12345678.90`             |
| `real`              | Nombre à virgule flottante sur 4 octets                                              | `3.14159`                 |
| `double precision`  | Nombre à virgule flottante sur 8 octets                                              | `3.141592653589793`       |
| `smallserial`       | Auto-incrément sur 2 octets (1 à 32 767)                                             | `42`                      |
| `serial`            | Auto-incrément sur 4 octets (1 à 2 147 483 647)                                      | `42`                      |
| `bigserial`         | Auto-incrément sur 8 octets (1 à 9 223 372 036 854 775 807)                          | `9223372036854775807`     |

::: tip

* serial est un type integer associé à une séquence
* bigserial est un type bigint associé à une séquence

La séquence associé est créé automatiquement lors de la création ou modification de la table
:::

## 2. Types monétaires

| Type      | Description                                      | Exemple de valeur |
|-----------|--------------------------------------------------|-------------------|
| `money`   | Montant monétaire (avec symbole de devise)       | `$1234.56`        |

::: warning
Attention ce type est fortement dépendant de la locale du serveur de base de données.

Si vous utilsier ce type, et que vous avez besoin de faire une sauvegarde et restauration, il faut vous assurer que
lc\_monetary est la même entre le serveur ou a été faite la sauvegarde et celui ou la base de données est restaurée.
:::

## 3. Types de caractères

| Type               | Description                                                                 | Exemple de valeur         |
|--------------------|-----------------------------------------------------------------------------|---------------------------|
| `character(n)`     | Chaîne de longueur fixe (rempli d'espaces si nécessaire)                    | `'PostgreSQL'`            |
| `varchar(n)`       | Chaîne de longueur variable (limite `n`)                                    | `'PostgreSQL'`            |
| `text`             | Chaîne de longueur illimitée                                                | `'PostgreSQL'`            |
| `char(n)`          | Équivalent à `character(n)`                                                 | `'SQL'`                   |
| `character varying`| Équivalent à `varchar`                                                      | `'PostgreSQL'`            |

## 4. Types binaires

| Type          | Description                                      | Exemple de valeur         |
|---------------|--------------------------------------------------|---------------------------|
| `bytea`       | Chaîne binaire (octets bruts)                    | `'\xDEADBEEF'`            |

## 5. Types date/heure

| Type                      | Description                                                                 | Exemple de valeur         |
|---------------------------|-----------------------------------------------------------------------------|---------------------------|
| `date`                    | Date (sans heure)                                                           | `'2025-09-12'`            |
| `time`                    | Heure (sans date)                                                           | `'14:30:00'`              |
| `time with time zone`     | Heure avec fuseau horaire                                                   | `'14:30:00+02'`           |
| `timestamp`               | Date et heure (sans fuseau horaire)                                         | `'2025-09-12 14:30:00'`   |
| `timestamp with time zone`| Date et heure avec fuseau horaire                                           | `'2025-09-12 14:30:00+02'`|
| `interval`                | Durée ou intervalle de temps                                                | `'1 day 2 hours'`         |

## 6. Types booléens

| Type      | Description                                      | Exemple de valeur         |
|-----------|--------------------------------------------------|---------------------------|
| `boolean` | Vrai ou faux                                     | `true`, `false`, `1`, `0` |

### Valeur vrai

Vrai peut être représenté avec les valeurs suivantes

* true
* yes
* on
* t
* 1

```sql
SELECT 'true'::boolean as true_boolean, 'yes'::boolean as yes_boolean, 
       'on'::boolean as on_boolean, 1::boolean as int_boolean, 
       't'::boolean as t_boolean;
```

Résultat

|true\_boolean|yes\_boolean|on\_boolean|int\_boolean|t\_boolean|
|:----------:|:---------:|:--------:|:---------:|:-------:|
|:heavy\_check\_mark:|:heavy\_check\_mark:|:heavy\_check\_mark:|:heavy\_check\_mark:|:heavy\_check\_mark:|

### Valeur faux

Faux peut être représenté avec les valeurs suivantes

* false
* no
* off
* f
* 0

```sql
SELECT 'false'::boolean as false_boolean, 'no'::boolean as no_boolean, 
       'off'::boolean as off_boolean, 0::boolean as int_boolean,
       'f'::boolean as f_boolean;
```

Résultat

|false\_boolean|no\_boolean|off\_boolean|int\_boolean|f\_boolean|
|:-----------:|:--------:|:---------:|:---------:|:-------:|
|:x:|:x:|:x:|:x:|:x:|

## 7. Types énumérés

| Type      | Description                                       | Exemple de valeur         |
|-----------|---------------------------------------------------|---------------------------|
| `enum`    | Type personnalisé avec valeurs prédéfinies        | `'rouge'`, `'vert'`       |

## 8. Types géométriques

| Type         | Description                                      | Exemple de valeur          |
|--------------|--------------------------------------------------|----------------------------|
| `point`      | Point géométrique (x, y)                         | `(10.0, 20.0)`             |
| `line`       | Ligne infinie                                    | `{(10.0,20.0),(30.0,40.0)}`|
| `lseg`       | Segment de ligne                                 | `[(10.0,20.0),(30.0,40.0)]`|
| `box`        | Rectangle                                        | `((10.0,20.0),(30.0,40.0))`|
| `path`       | Chemin (ligne brisée)                            | `[(10.0,20.0),(30.0,40.0)]`|
| `polygon`    | Polygone                                         | `((10.0,20.0),(30.0,40.0))`|
| `circle`     | Cercle                                           | `<(10.0,20.0),5.0>`        |

## 9. Types réseau

| Type         | Description                                      | Exemple de valeur           |
|--------------|--------------------------------------------------|-----------------------------|
| `cidr`       | Adresse IP réseau (CIDR)                         | `'192.168.1.0/24'`          |
| `inet`       | Adresse IP (IPv4 ou IPv6)                        | `'192.168.1.1'`             |
| `macaddr`    | Adresse MAC                                      | `'08:00:2b:01:02:03'`       |
| `macaddr8`   | Adresse MAC  (format EUI-64)                     | `'00:00:08:00:2b:01:02:03'` |

## 10. Types de bits

| Type         | Description                                      | Exemple de valeur         |
|--------------|--------------------------------------------------|---------------------------|
| `bit(n)`     | Chaîne de bits de longueur fixe                  | `B'1010'`                 |
| `bit varying`| Chaîne de bits de longueur variable              | `B'101010'`               |

## 11. Types de texte et recherche

| Type         | Description                                      | Exemple de valeur         |
|--------------|--------------------------------------------------|---------------------------|
| `tsvector`   | Vecteur de texte pour recherche full-text        | `'fat' 'cat' 'rat'`       |
| `tsquery`    | Requête de recherche full-text                   | `'fat & cat'`             |

## 12. Types UUID

| Type         | Description                                      | Exemple de valeur                        |
|--------------|--------------------------------------------------|------------------------------------------|
| `uuid`       | Identifiant unique universel                     | `'a0eebc99-9c0b-4ef8-bb6d-6bb9bd380a11'` |

## 13. Types JSON

| Type         | Description                                      | Exemple de valeur         |
|--------------|--------------------------------------------------|---------------------------|
| `json`       | Données JSON (texte brut)                        | `'{"nom": "PostgreSQL"}'` |
| `jsonb`      | Données JSON binaires (indexables)               | `'{"nom": "PostgreSQL"}'` |

## 14. Types XML

| Type         | Description                                      | Exemple de valeur         |
|--------------|--------------------------------------------------|---------------------------|
| `xml`        | Données XML                                      | `'<nom>PostgreSQL</nom>'` |

## 15. Types composites

| Type         | Description                                      | Exemple de valeur         |
|--------------|--------------------------------------------------|---------------------------|
| `composite`  | Type personnalisé (créé avec `CREATE TYPE`)      | `(valeur1, valeur2)`      |

### Création d’un type composite

Supposons que l'on veut créer un type pour représenter une adresse, et stocker:

* le nom de la rue
* la ville
* le code postal
* le pays
* le numéro de la rue

Nous allons donc créer le type ci-dessous

```sql
CREATE TYPE adresse_type AS (
    rue VARCHAR(100),
    ville VARCHAR(50),
    code_postal CHAR(5),
    pays VARCHAR(50),
    numero INTEGER
);
```

### Utilisation dans une table

On peut utiliser ce type comme colonne d’une table

```sql
CREATE TABLE clients (
   id SERIAL PRIMARY KEY,
   nom VARCHAR(100) NOT NULL,
   adresse adresse_type
);
```

### Insertion de données

Pour insérer une valeur de type composite, on utilise la syntaxe (val1, val2, ...):

```sql
INSERT INTO clients (nom, adresse)
VALUES (
    'Jean Dupont',
    ('Rue de Paris', 'Paris', '75000', 'France', 123)::adresse_type
);
```

### Accès aux champs d’un type composite

Pour accéder à un champ spécifique:

```sql
SELECT nom, (adresse).ville FROM clients;
```

Résultat

|id|nom|adresse|
|--|---|-------|
|1|Jean Dupont|(Rue de Paris,Paris,75000,France,123)|

### Mise à jour d’un champ composite

Pour mettre à jour un seul champ de la colonne du type composite :

```sql
UPDATE clients
SET adresse.pays = 'Espagne'
WHERE nom = 'Jean Dupont';
```

::: tip
Vous remarquerez que dans le cas de l'UPDATE, nous n'avons pas mis de parenthèse à adresse
:::

Nous avons maintenant le résultat dans la table

|id|nom|adresse|
|--|---|-------|
|1|Jean Dupont|(Rue de Paris,Paris,75000,Espagne,123)|

par contre si l'on avait besoin de faire une incrémentation d'un élement du type composite par exemple, nous aurions du utiliser la syntaxe suivante.

```sql
UPDATE clients
SET adresse.numero = (adresse).numero + 1
WHERE nom = 'Jean Dupont';
```

::: tip
Dans la partie gauche du SET (entre le SET et le =), nous avons la colonne de la table donc les parenthères ne sont pas nécéssaire,
par contre dans la partie nous pourrions avoir le nom d'un table (Voir UPDATE ... FROM ...), donc il faut indiquer
que l'on est sur une colonne
:::

Nous avons maintenant le résultat dans la table

|id|nom|adresse|
|--|---|-------|
|1|Jean Dupont|(Rue de Paris,Paris,75000,Espagne,124)|

## 16. Types de plage

| Type         | Description                                      | Exemple de valeur              |
|--------------|--------------------------------------------------|--------------------------------|
| `int4range`  | Plage d'entiers                                  | `[1, 10]`                      |
| `int8range`  | Plage de bigint                                  | `[1, 10000000000]`             |
| `numrange`   | Plage de nombres                                 | `[1.0, 10.0]`                  |
| `tsrange`    | Plage de timestamp (sans fuseau horaire)         | `['2025-01-01', '2025-12-31']` |
| `tstzrange`  | Plage de timestamp avec fuseau horaire           | `['2025-01-01', '2025-12-31']` |
| `daterange`  | Plage de dates                                   | `['2025-01-01', '2025-12-31']` |

## 17. Types d'identifiants d'objet

| Type         | Description                                      | Exemple de valeur         |
|--------------|--------------------------------------------------|---------------------------|
| `oid`        | Identifiant d'objet PostgreSQL                   | `12345`                   |
| `regproc`    | Nom de fonction (avec surcharge)                 | `'foobar(integer)'`       |
| `regclass`   | Nom de table                                     | `'ma_table'`              |

## 18. Types pseudo-types

| Type         | Description                                      | Exemple de valeur         |
|--------------|--------------------------------------------------|---------------------------|
| `any`        | Peut correspondre à n'importe quel type          | (utilisé dans les fonctions) |
| `anyarray`   | Peut correspondre à n'importe quel tableau       | (utilisé dans les fonctions) |
| `anyelement` | Peut correspondre à n'importe quel élément       | (utilisé dans les fonctions) |

## 19. Types de tableau

| Type         | Description                                      | Exemple de valeur         |
|--------------|--------------------------------------------------|---------------------------|
| `array`      | Tableau d'un type de base                        | `ARRAY[1, 2, 3]`          |

## 20. Types spécifiques à PostgreSQL

| Type            | Description                                      | Exemple de valeur         |
|-----------------|--------------------------------------------------|---------------------------|
| `pg_lsn`        | Position dans le journal de transactions (WAL)   | `'0/16B19F8'`             |
| `txid_snapshot` | Instantané de transaction                        | `'100:101:...'`           |

::: warning Informations complémentaires

* Certains types nécessitent des extensions (`uuid-ossp`, `pgcrypto`, etc.).
* PostgreSQL permet de créer des **types personnalisés** avec `CREATE TYPE`.
* Pour plus de détails, consultez la \[documentation officielle de PostgreSQL]\(https://docs.postgresql.fr/17/datatype.html type de données).
  :::

## Articles sur le net

* \[PostgreSQL - JSONB et
  Statistiques]\(https://blog.anayrat.info/2017/11/26/postgresql-jsonb-et-statistiques/ PostgreSQL jsonb et statistiques)

---

---
url: /articles/fonction-gs.md
description: >-
  Différentes cas d'utilisations de la fonction generate_series avec nombre,
  date, date heure
---

# Fonction generate\_series

## Introduction

Cette fonction est très polyvalente et permet de générer des séries de valeurs, ce qui est utile dans de nombreux scénarios

* Générateur de ligne avec incrément de 1 ou au choix,
* Générateur de plage de dates, mois, années, en spécifiant un interval (jours, mois, année, etc.),
* Générateur de date / heure, en spécifiant un interval (heure, minutes, seondes, etc.)

## Générer une série de nombres entiers

La forme la plus courante de `generate_series` permet de génèrer une série de nombres entiers.

### Syntaxe:

```sql
generate_series(start, stop[, step])
```

::: tip
Par defaut si le pas (step) n'est pas renseigné, celui-ci vaut `1`
:::

### Exemple:

Nous voulons un générateur de nombre impair, ci-dessous la requête de génération

```sql
SELECT * FROM generate_series(1, 10, 2);
```

### Résultat:

```
1
3
5
7
9
```

on peut également utilisé un pas négatif, dans ce cas il faut aboslument sur le `start`soit plus grand que le `stop`

```sql
SELECT * FROM generate_series(10, 1, -2);
```

### Résultat:

```
10
8
6
4
2
```

Vous remarquez dans ce cas que les nombres sont pairs, cela est du au fait que la valeur de `start` est pair.

## Générer une série de dates

`generate_series` peut aussi générer une série de dates, ce qui est utile pour créer des calendriers ou des rapports temporels.

### Syntaxe:

```sql
generate_series(start_date, end_date, interval)
```

### Exemple:

```sql
SELECT generate_series(
    '2025-10-01'::date,
    '2025-10-10'::date,
    '1 day'::interval
)::date AS date;
```

### Résultat:

```
2025-10-01
2025-10-02
2025-10-03
...
2025-10-10
```

## Générer une série de timestamps

Vous pouvez également générer des séries de timestamps, par exemple pour des analyses temporelles précises.

### Exemple:

```sql
SELECT generate_series(
    '2025-10-01 00:00:00'::timestamp,
    '2025-10-01 12:00:00'::timestamp,
    '1 hour'::interval
)::timestamp AS timestamp;
```

### Résultat:

```
2025-10-01 00:00:00
2025-10-01 01:00:00
...
2025-10-01 11:00:00
2025-10-01 12:00:00
```

## Utilisation avec une clause WITH (CTE)

`generate_series` est souvent utilisé dans une Common Table Expression (CTE) pour créer des jeux de données temporaires.

### Exemple:

```sql
WITH series AS (
    SELECT generate_series(1, 5) AS num
)
SELECT num as nombre, num * 2 AS double FROM series;
```

### Résultat:

```
nombre | double
-------|-------
1      | 2
2      | 4
3      | 6
4      | 8
5      | 10
```

## Générer des lignes manquantes dans un jeu de données

Si vous avez un jeu de données avec des valeurs manquantes, `generate_series` peut être utilisé pour combler les trous.

Pour cela nous allons utiliser le resultat du `generate_series` comme table principal, puis faire un `LEFT JOIN` pour récupérer
les données de ventes, le montant retourne `NULL` quand il n'y a pas de valeur, mais ici on utilise la fonction `COALESCE`
pour mettre  `0` si `NULL`

### Exemple:

Supposons une table `ventes` avec des dates manquantes:

```sql
WITH all_dates AS (
    SELECT generate_series(
        '2025-10-01'::date,
        '2025-10-05'::date,
        '1 day'::interval
    )::date AS date
)
SELECT
    a.date,
    COALESCE(v.montant, 0) AS montant
FROM all_dates a
LEFT JOIN ventes v ON a.date = v.date;
```

## Générer des séries personnalisées avec des fonctions

Vous pouvez combiner `generate_series` avec d'autres fonctions pour créer des séries personnalisées.

### Exemple:

```sql
SELECT
    generate_series(1, 5) AS num,
    chr(64 + generate_series(1, 5)) AS lettre;
```

### Résultat:

```
num | lettre
----|-------
1   | A
2   | B
3   | C
4   | D
5   | E
```

::: info

La requête ci-dessus peut également s'écrire

```sql
  SELECT
    generate_series(1, 5) AS num,
    chr(generate_series(65, 69)) AS lettre;
```

:::

La fonction `chr` permet d'obtenir la caractère à partir de la valeur décimale de la table `ASCII`

## Utilisation avec des jointures

`generate_series` peut être utilisé pour créer des jointures avec des tables existantes, par exemple pour générer des rapports par période.

### Exemple:

```sql
SELECT
    d.date,
    COUNT(o.id) AS nombre_commandes
FROM generate_series(
    '2025-10-01'::date,
    '2025-10-07'::date,
    '1 day'::interval
) AS d(date)
LEFT JOIN commandes o ON d.date = o.date_commande::date
GROUP BY d.date;
```

## Générer des séries de nombres décimaux

Vous pouvez aussi générer des séries de nombres décimaux en utilisant des valeurs de type `numeric`.

### Exemple:

```sql
SELECT generate_series(0.1, 1.0, 0.1) AS decimal_value;
```

### Résultat:

```
0.1
0.2
0.3
...
1.0
```

## Résumé des cas d'utilisation

| Cas d'utilisation                     | Exemple de syntaxe                                                                   |
|:--------------------------------------|:-------------------------------------------------------------------------------------|
| Série d'entiers                       | `SELECT * FROM generate_series(1, 10);`                                              |
| Série de dates                        | `SELECT generate_series('2025-10-01'::date, '2025-10-10'::date, '1 day'::interval);` |
| Série de timestamps                   | `SELECT generate_series('2025-10-01 00:00:00'::timestamp, ...);`                     |
| Combler des valeurs manquantes        | Utilisation avec `LEFT JOIN` et `COALESCE`                                           |
| Générer des séries personnalisées     | Combinaison avec d'autres fonctions                                                  |

---

---
url: /articles/ivorysql.md
description: >-
  IvorySQL, une base de données open source compatible Oracle basée sur
  PostgreSQL
---

### Qu'est-ce qu'IvorySQL ?

IvorySQL est une version modifiée de PostgreSQL, conçue pour être compatible avec Oracle. Elle permet aux entreprises de migrer leurs applications Oracle vers une solution open source sans avoir à tout réécrire.

IvorySQL est basée sur la dernière version de PostgreSQL et offre un mécanisme de bascule ("compatible\_db") pour passer facilement entre les modes de compatibilité Oracle et PostgreSQL natif.

### Fonctionnalités clés

* **Compatibilité Oracle** : IvorySQL prend en charge la syntaxe SQL Oracle, les types de données, et le langage procédural PL/SQL, ce qui facilite la migration des applications existantes.
* **Bascule entre modes** : Grâce à la commande `SET compatible_db = oracle;`, les utilisateurs peuvent activer ou désactiver la compatibilité Oracle selon leurs besoins.
* **Open Source** : IvorySQL est entièrement open source, ce qui permet de réduire les coûts de licence et de maintenance par rapport à Oracle.
* **Basé sur PostgreSQL** : IvorySQL hérite de toutes les fonctionnalités de PostgreSQL (performance, extensibilité, sécurité) tout en ajoutant la couche de compatibilité Oracle.

### Exemples de transition Oracle → IvorySQL

1. **Syntaxe SQL** :
   * Oracle : `SELECT * FROM employees WHERE hiredate = TO_DATE('01-JAN-2020', 'DD-MON-YYYY');`
   * IvorySQL : La même requête fonctionne sans modification, car IvorySQL supporte la fonction `TO_DATE` et le format de date Oracle.

2. **Procédures stockées (PL/SQL)** :
   * Oracle :
     ```sql
     CREATE OR REPLACE PROCEDURE add_employee(
         p_name VARCHAR2,
         p_salary NUMBER
     ) AS
     BEGIN
         INSERT INTO employees(name, salary) VALUES(p_name, p_salary);
     END;
     ```
   * IvorySQL : La même procédure peut être créée et exécutée sans modification, car IvorySQL supporte la syntaxe PL/SQL.

3. **Types de données** :
   * Oracle : `VARCHAR2`, `NUMBER`, `DATE`
   * IvorySQL : Ces types sont reconnus et mappés automatiquement vers les types PostgreSQL équivalents.

4. **Fonctions Oracle** :
   * Oracle : `NVL`, `DECODE`, `TO_CHAR`
   * IvorySQL : Ces fonctions sont disponibles et fonctionnent comme en Oracle.

### Pourquoi migrer vers IvorySQL ?

* **Réduction des coûts** : Pas de licence Oracle, maintenance et support moins coûteux.
* **Flexibilité** : Possibilité de basculer entre les modes Oracle et PostgreSQL natif.
* **Communauté open source** : Accès à une communauté active et à des mises à jour régulières.
* **Migration simplifiée** : Pas besoin de réécrire entièrement les applications existantes.

### Limites

* La compatibilité n'est pas à 100 % : certaines fonctionnalités avancées d'Oracle peuvent ne pas être encore supportées.
* Les très grosses entreprises déjà investies dans Oracle peuvent hésiter à migrer en raison des risques perçus.

### Ressources utiles

* [Site officiel IvorySQL](https://www.ivorysql.org/en/)
* [Documentation IvorySQL](https://www.ivorysql.org/en/docs/intro/)
* [GitHub IvorySQL](https://github.com/IvorySQL/IvorySQL)

---

---
url: /migrations/mysql.md
description: Article sur les possibilités de migration de MySQL vers une base PostgreSQL
---

# Migration de MySQL vers PostgreSQL

## Pourquoi migrer de MySQL vers PostgreSQL ?

PostgreSQL offre plusieurs avantages par rapport à MySQL :

* **Fonctionnalités avancées** : Support natif des types JSON, des requêtes géospatiales, des CTE (Common Table Expressions), des fonctions fenêtrées, et des transactions avancées.
* **Extensibilité** : Possibilité de créer ses propres types de données, opérateurs, fonctions et index.
* **Conformité aux standards SQL** : PostgreSQL est plus proche du standard SQL que MySQL.
* **Performance** : Meilleure gestion des requêtes complexes et des charges lourdes.
* **Communauté et écosystème** : PostgreSQL est open source, avec une communauté très active et une documentation riche.
* **Sécurité** : Rôles et permissions plus granulaires, chiffrement natif, et audit avancé.

::: tip MISE AU POINT
On entend souvent que MySQL est plus rapide, il l'est mais dans un seul cas précis, celui ou l'on fait
un select sur une seule table (pas de jointure) et en MyISAM (sans possibilité de modèle relationnel avec PK et FK)
ce qui bien sur n'est jamais le cas dans les situations réelles avec une modélisation de base de données qui assure l'a qualité et l'intégrité des données.

Le moteur MyISAM a également plusieurs défauts à mes yeux:

* MyISAM utilise le cache uniquement pour les indexes, ce qui pénalise les tables volumineuses et les recherches qui n'utilisent pas les index.
* en cas de crash serveur, il doit recronstruire toute la table (ce qui arrive aussi en cas de manque d'espace disque), ce qui peut être pénalisant en environnement virtualisé

Tableau récapitulatif des 2 moteurs disponibles sous MySQL

| Fonctionnalité | MyISAM | InnoDB |
| :------------: | :----- | :----- |
| Cache des données | Non (seulement les index) | Oui (Buffer Pool pour données + index) |
| Cache des index | Oui (Key Buffer) | Oui (dans le Buffer Pool) |
| Transactions | Non | Oui (ACID) |
| Verrouillage | Verrouillage de table | Verrouillage de ligne |
| Performances en lecture | Rapide (si indexés) | Rapide (même pour les données) |
| Performances en écriture | Lente (verrous de table) | Optimisée (Buffer Pool + Change Buffer) |
| Crash Recovery | Non (risque de corruption) | Oui (redo log) |
| Configuration clé | key\_buffer\_size | innodb\_buffer\_pool\_size |
| Utilisation typique | Tables en lecture seule, reporting | Applications transactionnelles |

Si vous regardez ce tableau, vous voyez immédiatement que MyISAM ne devrait pas être utilisé en production
privilégié le format InnoDB
:::

## Méthodes et outils de migration

### Export/Import via fichiers (CSV, SQL)

* **Exemple** :
  ```bash
  # Export depuis MySQL
  mysqldump -u utilisateur -p --no-create-info --skip-extended-insert base_de_donnees > donnees.sql
  # Import vers PostgreSQL (après adaptation manuelle du fichier)
  psql -U utilisateur -d base_de_donnees -f donnees_adaptees.sql
  ```
* **Adaptation nécessaire** :
  * Les types de données diffèrent (ex : `INT` → `INTEGER`, `DATETIME` → `TIMESTAMP`).
  * Les fonctions spécifiques à MySQL (comme `NOW()`) doivent être remplacées par leurs équivalents PostgreSQL (`CURRENT_TIMESTAMP`).
  * Les dates au format `0000-00-00` (MySQL) ne sont pas acceptées par PostgreSQL et doivent être corrigées par NULL.

### Utilisation d'outils dédiés

* **[pgloader](https://pgloader.io/)** : Outil puissant pour migrer des données depuis MySQL vers PostgreSQL. Exemple de commande :
  ```bash
  pgloader mysql://utilisateur:motdepasse@localhost/base_de_donnees postgresql://utilisateur:motdepasse@localhost/base_de_donnees
  ```
  * pgloader gère automatiquement la conversion des types et des schémas, et permet une migration incrémentale.
* **[Boîte à outils ESF](https://www.dbsofts.com/articles/mysql_to_postgresql/)** : Solution graphique pour une migration guidée, avec génération de rapports de validation.
* **[Ispirer Toolkit](https://www.ispirer.com/products/postgresql-migration#migrate-to-postgresql)** : Automatise la migration de grandes bases de données et du code applicatif.

### Migration via un ETL

* Utilisation d'outils comme Talend, Pentaho ou Apache NiFi pour extraire, transformer et charger les données entre les deux SGBD.

## Exemples de conversion

### Types de données

| MySQL          | PostgreSQL      |
|----------------|-----------------|
| `INT`          | `INTEGER`       |
| `VARCHAR(255)` | `VARCHAR(255)`  |
| `DATETIME`     | `TIMESTAMP`     |
| `TEXT`         | `TEXT`          |
| `ENUM`         | `CHECK` + `VARCHAR` ou `CREATE TYPE` |

### Fonctions SQL

| MySQL               | PostgreSQL               |
|---------------------|--------------------------|
| `NOW()`             | `CURRENT_TIMESTAMP`      |
| `IFNULL(col, val)`  | `COALESCE(col, val)`     |
| `LIMIT 10 OFFSET 5` | `LIMIT 5 OFFSET 10`      |
| `AUTO_INCREMENT`    | `SERIAL` ou `IDENTITY`   |

## Étapes clés d'une migration réussie

1. **Préparation** :
   * Vérifier la compatibilité des schémas et des données.
   * Adapter les types de données et les requêtes SQL.
   * Tester la migration sur un environnement de staging.
2. **Migration** :
   * Utiliser un outil comme pgloader pour transférer les données.
   * Vérifier l'intégrité des données après migration.
3. **Post-migration** :
   * Optimiser les performances (index, requêtes).
   * Former les équipes aux spécificités de PostgreSQL.

## Avantages concrets de PostgreSQL après migration

* **Meilleure gestion des données complexes** : Support natif des JSON, des tableaux, et des types personnalisés.
* **Requêtes avancées** : Possibilité d'utiliser des CTE, des fonctions fenêtrées, et des requêtes récursives.
* **Extensibilité** : Ajout de modules comme PostGIS pour la géolocalisation.
* **Fiabilité** : Transactions ACID robustes, réplication avancée, et sauvegardes point-in-time recovery (PITR).
* **Coût** : Pas de licence commerciale, réduction des coûts d'infrastructure et de maintenance.

## Ressources utiles

* [Documentation pgloader](https://pgloader.io/)
* [Wiki PostgreSQL : Conversion depuis d'autres bases](https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL)

---

---
url: /migrations/oracle.md
description: Article sur les possibilités de migration de Oracle vers une base PostgreSQL
---

# Migration de Oracle vers PostgreSQL

## Ora2Pg

### Qu'est-ce qu'Ora2Pg ?

[Ora2Pg](https://ora2pg.darold.net/ "Ora2Pg") est un outil open source (licence GPL), écrit en Perl, qui permet d'automatiser la migration des schémas, des données et du code PL/SQL d'une base de données Oracle vers PostgreSQL. Il analyse la base Oracle, génère des scripts SQL compatibles PostgreSQL, et peut même exporter les données. Ora2Pg est maintenu activement depuis 2001 et est aujourd'hui un standard pour les migrations Oracle → PostgreSQL.

### Fonctionnalités principales

* **Export du schéma** : Tables, vues, index, contraintes, séquences, utilisateurs et droits.
* **Conversion des types de données** : Oracle `VARCHAR2` → PostgreSQL `VARCHAR`, Oracle `NUMBER` → PostgreSQL `NUMERIC`, etc.
* **Conversion du code PL/SQL** : Ora2Pg convertit automatiquement une grande partie du code PL/SQL (fonctions, procédures, triggers) en PL/pgSQL, mais une relecture manuelle est souvent nécessaire pour les spécificités Oracle.
* **Export des données** : Possibilité d'exporter les données sous forme de fichiers plats (CSV, INSERT SQL) ou de les charger directement dans PostgreSQL.
* **Rapport d'évaluation** : Ora2Pg génère un rapport détaillant les objets non convertis automatiquement, ce qui permet d'estimer l'effort de migration restant.

### Exemples d'utilisation

#### 1. Installation et configuration

Ora2Pg nécessite une installation Perl et des connecteurs Oracle/PostgreSQL. Exemple de configuration minimale dans `ora2pg.conf` :

```ini
ORACLE_HOME /usr/lib/oracle/19.3/client64
ORACLE_DSN dbi:Oracle:host=localhost;sid=ORCL
ORACLE_USER scott
ORACLE_PWD tiger
SCHEMA scott
OUTPUT output.sql
TYPE TABLE,VIEW,SEQUENCE,INDEX,TRIGGER,FUNCTION,PROCEDURE,PACKAGE
```

#### 2. Export d'un schéma Oracle

```bash
ora2pg -c ora2pg.conf -t TABLE,VIEW,SEQUENCE -o schema.sql
```

→ Génère un fichier `schema.sql` avec la structure des tables, vues et séquences.

#### 3. Export des données

```bash
ora2pg -c ora2pg.conf --data_only --output data.sql
```

→ Exporte les données sous forme de requêtes `INSERT`.

#### 4. Conversion d'une fonction PL/SQL

Ora2Pg convertit automatiquement des fonctions comme :

```sql
-- Oracle
CREATE OR REPLACE FUNCTION get_salary(p_emp_id NUMBER)
RETURN NUMBER IS
  v_salary NUMBER;
BEGIN
  SELECT salary INTO v_salary FROM employees WHERE emp_id = p_emp_id;
  RETURN v_salary;
END;
```

→ En PL/pgSQL :

```sql
-- PostgreSQL
CREATE OR REPLACE FUNCTION get_salary(p_emp_id NUMERIC)
RETURNS NUMERIC AS $$
DECLARE
  v_salary NUMERIC;
BEGIN
  SELECT salary INTO v_salary FROM employees WHERE emp_id = p_emp_id;
  RETURN v_salary;
END;
$$ LANGUAGE plpgsql;
```

#### 5. Migration incrémentale

Ora2Pg peut être utilisé pour migrer les données en plusieurs étapes :

* Pré-migration des données statiques.
* Arrêt de la production Oracle le jour J.
* Migration des données restantes.
* Re-création des index et contraintes sur PostgreSQL.

### Points forts et limites

* **Points forts** :
  * Automatisation poussée, gain de temps.
  * Communauté active, documentation complète.
  * Flexibilité (export en fichiers ou chargement direct).
* **Limites** :
  * Certaines fonctionnalités Oracle avancées (comme les packages complexes) nécessitent une adaptation manuelle.
  * Ora2Pg ne modifie pas l'applicatif (seulement la base de données).

### Ressources utiles

* [Site officiel Ora2Pg](https://ora2pg.darold.net/)
* [Documentation Ora2Pg](https://ora2pg.darold.net/documentation.html)

***

## IvorySQL

IvorySQL est un moteur de base de données basé sur PostgreSQL et qui est compatible Oracle.

Vous trouverez plus d'information sur sa [page qui lui est consacré](/articles/ivorysql "Article sur IvorySQL")

---

---
url: /migrations/sql-server.md
description: >-
  Article sur les possibilités de migration de SQL Server vers une base
  PostgreSQL
---

# Migration de SQL Server vers PostgreSQL

## Préparation et analyse

* **Évaluation des différences** : PostgreSQL et SQL Server ont des types de données, des syntaxes SQL et des fonctionnalités différentes (ex : gestion des majuscules/minuscules, procédures stockées, types de données comme `NVARCHAR` vs `TEXT`).
* **Exemple** : Les procédures stockées SQL Server doivent souvent être converties en fonctions PostgreSQL, car les versions antérieures à PostgreSQL 11 ne supportent pas les procédures stockées de la même manière.
* **Transact SQL**: SQL Server (et Sybase dont il partage le même héritage) utilise du Transact SQL au lieu du SQL standard

## le Transact-SQL (aka T-SQL)

### Origine et Portée

* **SQL standard** :
  * Langage normalisé par l’ANSI et l’ISO pour interagir avec les bases de données relationnelles.
  * Utilisé par la plupart des SGBD (PostgreSQL, MySQL, Oracle, etc.).
  * Se concentre sur les requêtes de données (SELECT, INSERT, UPDATE, DELETE).

* **Transact-SQL (T-SQL)** :
  * Extension propriétaire Sybase, également utilisé par Microsoft pour SQL Server.
  * Ajoute des fonctionnalités procédurales (boucles, conditions, gestion des erreurs).
  * Utilisé uniquement dans l’écosystème Microsoft (SQL Server, Azure SQL, Sybase).

### Fonctionnalités Procédurales

* **SQL standard** :
  * Ne supporte pas nativement les boucles, conditions ou variables.
  * Les opérations complexes nécessitent souvent des requêtes imbriquées ou des scripts externes.

* **T-SQL** :
  * Supporte les **variables** (`DECLARE @var INT`), les **boucles** (`WHILE`, `FOR`), les **conditions** (`IF...ELSE`), et les **blocs de code** (`BEGIN...END`).
  * Permet la création de **procédures stockées**, **fonctions**, et **triggers** avec une logique complexe.

### Gestion des Erreurs

* **SQL standard** :
  * Pas de gestion des erreurs intégrée. Les erreurs doivent être gérées par l’application cliente.

* **T-SQL** :
  * Utilise `TRY...CATCH` pour capturer et traiter les erreurs directement dans le code SQL:
    ```sql
    BEGIN TRY
        -- Code susceptible de générer une erreur
    END TRY
    BEGIN CATCH
        SELECT ERROR_MESSAGE() AS Error;
    END CATCH
    ```

### Fonctions et Procédures Stockées

* **SQL standard** :
  * Les fonctions sont limitées et ne peuvent pas modifier l’état de la base (pas d’INSERT/UPDATE/DELETE dans une fonction).

* **T-SQL** :
  * Permet de créer des **procédures stockées** avec des paramètres d’entrée/sortie et des opérations de modification de données.
  * Exemple :
    ```sql
    CREATE PROCEDURE GetCustomer @CustomerID INT
    AS
    BEGIN
        SELECT * FROM Customers WHERE CustomerID = @CustomerID;
    END
    ```

### Syntaxe et Extensions

* **SQL standard** :
  * Syntaxe basique pour les requêtes (ex : `SELECT * FROM table WHERE condition`).

* **T-SQL** :
  * Extensions spécifiques :
    * `TOP` pour limiter le nombre de lignes : `SELECT TOP 10 * FROM table`.
    * `WITH` pour les Common Table Expressions (CTE) avancées.
    * `OUTPUT` pour retourner les lignes affectées par une requête DML.
    * `SET ROWCOUNT` pour limiter le nombre de lignes traitées.

### Transactions

* **SQL standard** :
  * Supporte les transactions basiques (`BEGIN TRANSACTION`, `COMMIT`, `ROLLBACK`).

* **T-SQL** :
  * Offre un contrôle plus fin avec des niveaux d’isolation (`READ UNCOMMITTED`, `REPEATABLE READ`, etc.) et des verrous explicites.

### Types de Données

* **SQL standard** :
  * Types de données standardisés (`INT`, `VARCHAR`, `DATE`).

* **T-SQL** :
  * Types spécifiques à SQL Server (`NVARCHAR`, `DATETIME2`, `UNIQUEIDENTIFIER`, `MONEY`).

### Exemples de Différences de Syntaxe

| Opération               | SQL Standard                     | T-SQL (SQL Server)               |
|-------------------------|----------------------------------|----------------------------------|
| Limiter les résultats   | `SELECT * FROM table LIMIT 10`   | `SELECT TOP 10 * FROM table`     |
| Concaténation           | `SELECT col1 || col2 FROM table` | `SELECT col1 + col2 FROM table`  |
| Gestion des dates       | `CURRENT_DATE`                   | `GETDATE()`                      |
| Commentaires            | `--` ou `/* */`                  | Idem, mais aussi `/*...*/`       |

### Compatibilité

* **T-SQL** n’est pas portable : un script T-SQL doit souvent être réécrit pour fonctionner sur PostgreSQL, MySQL ou Oracle.
* **SQL standard** est conçu pour être portable, mais chaque SGBD ajoute ses propres extensions.

## Outils de migration populaires

### AWS Schema Conversion Tool (SCT)

* **Fonctionnalités** : Convertit le schéma (tables, vues, procédures) et les données. Intègre avec AWS Database Migration Service (DMS) pour une migration fluide.
* **Exemple** : Permet de configurer des paramètres de conversion spécifiques (ex : utiliser `CITEXT` pour gérer l’insensibilité à la casse).

### pgloader

* **Fonctionnalités** : Outil open source pour charger des données depuis SQL Server vers PostgreSQL. Supporte la conversion des types de données et des contraintes.
* **Exemple** : Commande typique :
  ```bash
  pgloader mssql://utilisateur:motdepasse@serveur/basededonnées postgresql://utilisateur:motdepasse@serveur/basededonnées
  ```
* **Avantage** : Rapide et flexible pour les migrations de données massives.

### ESF Database Migration Toolkit

* **Fonctionnalités** : Interface graphique pour migrer schémas et données en 3 étapes (connexion, mappage, exécution).
* **Exemple** : Permet de sélectionner les schémas source et cible, et de lancer la migration en un clic.

### SQLWays (Ispirer)

* **Fonctionnalités** : Convertit les scripts Transact-SQL en PL/pgSQL, gère les dépendances entre objets.
* **Exemple** : Peut convertir des fonctions SQL Server en fonctions PostgreSQL équivalentes.

### Ora2pg

* **Fonctionnalités** : Bien que conçu pour Oracle, il peut aussi aider pour SQL Server, notamment pour la conversion de schémas et de données.

## Étapes clés de la migration

1. **Conversion du schéma** : Adapter les types de données (ex : `DATETIME` → `TIMESTAMP`), les contraintes, et les index.
2. **Migration des données** : Utiliser un outil comme pgloader ou AWS DMS pour transférer les données.
3. **Conversion du code** : Réécrire les procédures stockées, triggers et fonctions en PL/pgSQL.
4. **Tests** : Vérifier l’intégrité des données, les performances et la compatibilité des requêtes.

## Exemples concrets

* **Gestion des majuscules/minuscules** : Utiliser l’extension `CITEXT` dans PostgreSQL pour émuler le comportement de SQL Server.
* **Migration de procédures** : Convertir une procédure SQL Server en fonction PostgreSQL :
  ```sql
  -- SQL Server
  CREATE PROCEDURE GetCustomer @id INT AS SELECT * FROM Customers WHERE id = @id;
  -- PostgreSQL
  CREATE FUNCTION get_customer(id INT) RETURNS SETOF Customers AS $$ SELECT * FROM Customers WHERE id = $1; $$ LANGUAGE SQL;
  ```

## Bonnes pratiques et pièges à éviter

* **Sauvegardes** : Toujours sauvegarder les bases source et cible avant la migration.
* **Downtime** : Prévoir une fenêtre de maintenance pour les migrations de grandes bases.
* **Compatibilité** : Tester les applications clientes avec la nouvelle base PostgreSQL.

## Ressources utiles

* [AWS SCT Documentation](https://docs.aws.amazon.com/fr_fr/SchemaConversionTool/latest/userguide/CHAP_Source.SQLServer.ToPostgreSQL.html)
* [pgloader Documentation](https://pgloader.io/)
* [ESF Database Migration Toolkit](https://www.dbsofts.com/fr/articles/mssql_a_postgresql/)

---

---
url: /programmation/c.md
description: Programmation PostgreSQL avec le langage C en utilisant la libpq et ecpg
---

# Langage C {#langage\_c}

PostgreSQL étant écrit en **C**, il existe par conséquent une bibliothèque native qui se nomme
[libpq](https://docs.postgresql.fr/current/libpq.html)

## Bibliothèque libpq {#language\_c\_libpq}

La bibliothèque pour le language C se nomme
[libpq](https://docs.postgresql.fr/current/libpq.html) .

D'autres langages de programmation on également leur bibliothèque mais
les principales s'appuie sur la libpq via des wrappers

Pour commencer à travailler avec libpq dans votre programme C, vous
devez importer les bibliothèques nécessaires.

Ouvrez votre fichier de programme C et incluez les bibliothèques
suivantes en haut du fichier

```C
#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>
```

### Etablir une connexion

Pour établir une connexion à la base de données PostgreSQL à l'aide de
libpq, nous utiliserons la fonction PQconnectdb().

Cette fonction ouvre une nouvelle connexion à la base de données en
fonction des paramètres fournis dans la chaîne **conninfo**.

La chaîne **conninfo** contient un ou plusieurs paramètres au format
**keyword=value**, séparés par des espaces. Vous pouvez utiliser des
paramètres par défaut en transmettant une chaîne vide ou spécifier des
paramètres personnalisés selon vos besoins.

Pour inclure une valeur nulle ou une valeur avec des espaces, placez-la
entre guillemets simples (keyword='value'). Si nécessaire, échappez
les guillemets simples dans la valeur à l'aide d'une barre oblique
inverse ('). Les espaces autour du signe égal sont facultatifs.

Il est important de noter que la fonction PQconnectdb() renvoie toujours
un pointeur d'objet PGconn non nul, sauf si la mémoire est insuffisante
pour allouer l'objet.

Pendant le processus de connexion, vous pouvez vérifier l'état de la
connexion à l'aide de la fonction PQstatus().

Si l'état est **CONNECTION\_BAD**, la procédure de connexion a échoué.

A l'inverse, si le statut est **CONNECTION\_OK**, la connexion est prête.

Pour fermer correctement la connexion et libérer la mémoire utilisée par
l'objet PGconn, appelez la fonction [PQfinish()](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PQFINISH).

Même si la tentative de connexion au backend échoue (comme indiqué par
PQstatus), il est essentiel d'appeler [PQfinish()](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PQFINISH)
pour libérer la mémoire allouée. Après avoir appelé [PQfinish()](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PQFINISH),
le pointeur **PGconn** ne doit plus être utilisé.

Ci-dessous un exemple de programme qui se connect au serveur de base de
données, et affiche les informations de connexions

```c
#include <stdio.h>
#include <stdlib.h>
#include <libpq-fe.h>

int main(int argc, char *argv[]) {
   printf("Tuto utilisation de la libpq \n");

   // Connexion à la base de données
   // la chaine conninfo contient les mots clés et les valeurs séparés par des espaces.
   char *conninfo = "dbname=votre_nom_db user=utilisateur password=mot_de_passe host=localhost port=5432";

   // Creation de la connexion
   PGconn *conn = PQconnectdb(conninfo);

   // Vérification si la connexion s'est faite correctement
   if (PQstatus(conn) != CONNECTION_OK) {
      // Si echec de connxion, nous imprimons les messages d'erreur et liberont les ressources
      printf("Erreur lors de la connexion au serveur de base de données: %s\n", PQerrorMessage(conn));

      // On ferme la connexion
      PQfinish(conn);

      // On sort du programme avec un code 1 pour indiquer une erreur
      exit(1);
   }

   // La connexion a été établie avec succès, nous affichons les informations du serveur de base de données
   printf("Connection établie\n");
   printf("Port: %s\n", PQport(conn));
   printf("Hote: %s\n", PQhost(conn));
   printf("Nom de la DB: %s\n", PQdb(conn));

   // Fermeture de la connexion et libération de la mémoire
   PQfinish(conn);

   return 0;
}
```

Dans ce code, remplacez votre\_nom\_dn, utilisateur et mot\_de\_passe par
les valeurs appropriées pour votre configuration PostgreSQL. Le
programme imprime les détails de la connexion, tels que le port, l'hôte
et le nom de la base de données, pour confirmer la connexion réussie.

Enfin, la connexion est fermée à l'aide de [PQfinish()](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-PQFINISH)
pour libérer la mémoire allouée à l'objet PGconn.

### Executer une requête SQL

Une fois la connexion à la base de données établie, nous pouvons
procéder à l'exécution des requêtes à l'aide de libpq.

La fonction principale que nous utiliserons pour l'exécution des
requêtes est [PQexec()](https://www.postgresql.org/docs/current/libpq-exec.html#LIBPQ-EXEC-MAIN).

La fonction [PQexec()](https://www.postgresql.org/docs/current/libpq-exec.html#LIBPQ-EXEC-MAIN)
est utilisée pour soumettre une requête à PostgreSQL et attendre le résultat.

Elle renvoie un pointeur PGresult, qui encapsule le résultat de la requête renvoyé par le backend de la base de données.

Dans la plupart des cas, un pointeur non nul est renvoyé, sauf dans des
situations telles que des conditions de manque de mémoire ou des erreurs
critiques empêchant l'envoi de la requête au backend.

Si un pointeur nul est renvoyé, il doit être traité comme un résultat **PGRES\_FATAL\_ERROR**.

Pour obtenir plus d'informations sur l'erreur, vous pouvez utiliser la fonction
[PQerrorMessage()](https://www.postgresql.org/docs/current/libpq-exec.html#LIBPQ-PQRESULTERRORMESSAGE).

La structure PGresult doit être conservée comme une abstraction lors de
l'utilisation du résultat de la requête. Il est recommandé d'utiliser
des fonctions d'accès au lieu de référencer directement les champs de
la structure **PGresult**, car les champs peuvent changer dans les
futures versions de libpq.

Après avoir exécuté une requête à l'aide de [PQexec()](https://www.postgresql.org/docs/current/libpq-exec.html#LIBPQ-EXEC-MAIN),
vous pouvez vérifier l'état du résultat à l'aide de PQresultStatus().

Les états de résultat possibles incluent:

* **PGRES\_EMPTY\_QUERY**: la chaîne de requête envoyée par le backend était vide.
* **PGRES\_COMMAND\_OK**: la commande s'est terminée avec succès, mais aucune donnée n'a été renvoyée.
* **PGRES\_TUPLES\_OK**: la requête s'est exécutée avec succès et a renvoyé des tuples (lignes).
* **PGRES\_COPY\_OUT**: le transfert de données (copie sortante) depuis le serveur a commencé.
* **PGRES\_COPY\_IN**: le transfert de données (copie entrante) vers le serveur a commencé.
* **PGRES\_BAD\_RESPONSE**: la réponse du serveur n'a pas été comprise.
* **PGRES\_NONFATAL\_ERROR**: une erreur non fatale s'est produite lors de l'exécution de la requête.
* **PGRES\_FATAL\_ERROR**: une erreur fatale s'est produite lors de l'exécution de la requête.

Si le statut du résultat de la requête est **PGRES\_TUPLES\_OK**, vous pouvez utiliser
diverses fonctions pour récupérer des informations sur les tuples renvoyés.

Voici quelques fonctions utiles:

* **PQntuples()** : renvoie le nombre de tuples (lignes) dans le résultat de la requête.
* **PQnfields()** : renvoie le nombre de champs (attributs) dans chaque tuple du résultat de la requête.
* **PQfname()** : renvoie le nom du champ (attribut) associé à l'index de champ donné. Les indices de champ commencent à 0.
* **PQftype()** : renvoie le type de champ associé à l'index de champ donné.
  L'entier renvoyé représente un codage interne du type. Les indices de champ commencent à 0.
* **PQgetvalue()** : renvoie la valeur d'un champ spécifique (attribut)
  dans un tuple du résultat de la requête. Les indices de tuple et de
  champ commencent à 0.

Ces fonctions fournissent des fonctionnalités essentielles pour
récupérer et travailler avec les résultats de la requête.

```C
// Requête a exécuter
char *query = "SELECT * FROM ma_table";

// Envoyer la requête et récupérer les résultats
PGresult *res = PQexec(conn, query);

// Vérifier l'état de résultat de la requête
ExecStatusType resStatus = PQresultStatus(res);

// Convertir l'état en message texte et 'l'afficher
printf("Etat requete: %s\n", PQresStatus(resStatus));
```

Vérification de ce que retourne la requête

```c
if (resStatus != PGRES_TUPLES_OK) {
    //Si on ne récupère pas de ligne, on affiche et un message et on termine la connexion
    printf("Erreur lors de l'execution de la requête: %s\n", PQerrorMessage(conn));

    PQclear(res);

    PQfinish(conn);

    exit(1);
}

// On recupère des données, on affiche un message
printf("Requête exécutée avec succès\n");
```

Ensuite on affiche le résultat sur la console.

```c
// On récupère le nombre de lignes et de colonne
int rows = PQntuples(res);
int cols = PQnfields(res);
printf("Nombre de lignes: %d\n", rows);
printf("Nombre de colonnes: %d\n", cols);

// On affiche les noms de colonnes
for (int i = 0; i < cols; i++) {
    printf("%s\t", PQfname(res, i));
}
printf("\n");

// On affiche le contenue des lignes
for (int i = 0; i < rows; i++) {
    for (int j = 0; j < cols; j++) {
        printf("%s\t", PQgetvalue(res, i, j));
    }
    printf("\n");
}
```

On n'oublie pas de liberer les ressources et de fermer la connexion

```c
PQclear(res);

PQfinish(conn);

return 0;
```

Pour compiler et exécuter votre code, suivez les étapes ci-dessou:

1. Assurez-vous que le répertoire bin de PostgreSQL est inclus dans le
   chemin de vos variables d'environnement. Cela permet au compilateur
   de localiser les bibliothèques et exécutables PostgreSQL
   nécessaires.
2. Ouvrez le terminal ou l'invite de commande et accédez au répertoire
   où se trouve votre fichier C.
3. Utilisez la commande suivante pour compiler votre code:

```shell
gcc monprogramme.c -o monprogramme -I "path/to/postgres/include" -L "path/to/postgres/lib" -lpq
```

Si la compilation s'est déroulé correctement, vous devriez avoir un
executable **monprogramme** dans votre dossier

Que vous pourrez lancer comme ceci:

```shell
./monprogramme
```

Pour plus de maintenabilité, vous pourrez privilégié la creation d'un fichier [Makefile](https://fr.wikipedia.org/wiki/Make).

## Bibiothèque ECPG

[ECPG](https://www.postgresql.org/docs/current/app-ecpg.html) est un préprocesseur, qui vous permet d'embarquer du SQL
directement dans votre programme en C

Vos fichiers C embarquant du SQL auront pour extension **pgc**.

Chaque instructions utilisants du SQL commencera par **EXEC SQL**.

Lors de la compilation, les fichiers ayant l'extension pgc seront
traduit en fichier C et seront ensuite compilés

Ci-dessous un exemple tiré de la documentation utilisant de multiples
connexions

```c
#include <stdio.h>

EXEC SQL BEGIN DECLARE SECTION;
    char nomdb[1024];
EXEC SQL END DECLARE SECTION;

int
main()
{
    EXEC SQL CONNECT TO basetest1 AS con1 USER utilisateurtest;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT;
    EXEC SQL CONNECT TO basetest2 AS con2 USER utilisateurtest;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT;
    EXEC SQL CONNECT TO basetest3 AS con3 USER utilisateurtest;
    EXEC SQL SELECT pg_catalog.set_config('search_path', '', false); EXEC SQL COMMIT;

    /* Cette requête serait exécuté dans la dernière base ouverte "basetest3". */
    EXEC SQL SELECT current_database() INTO :nomdb;
    printf("courante=%s (devrait être basetest3)\n", nomdb);

    /* Utiliser "AT" pour exécuter une requête dans "basetest2" */
    EXEC SQL AT con2 SELECT current_database() INTO :nomdb;
    printf("courante=%s (devrait être basetest2)\n", nomdb);

    /* Basculer la connexion courante à "basetest1". */
    EXEC SQL SET CONNECTION con1;

    EXEC SQL SELECT current_database() INTO :nomdb;
    printf("courante=%s (devrait être basetest1)\n", nomdb);

    EXEC SQL DISCONNECT ALL;
    return 0;
}
```

---

---
url: /programmation/csharp.md
description: Programmation PostgreSQL avec le langage C# en utilisant la Npgsql
---

# Programmation PostgreSQL en langage C\#

## Introduction à l’utilisation de PostgreSQL avec C\#

PostgreSQL est un système de gestion de base de données relationnelle (SGBDR) open source, puissant et extensible.

Pour interagir avec PostgreSQL en C#, deux approches principales sont couramment utilisées :

* **Npgsql** : Un pilote ADO.NET natif pour PostgreSQL, idéal pour des requêtes SQL directes et un contrôle fin.
* **Entity Framework Core** : Un ORM (Object-Relational Mapper) qui simplifie la manipulation des données en utilisant des objets C#.

## Utilisation de Npgsql (Pilote natif)

### Installation

Ajoutez le package NuGet **Npgsql** à votre projet:

```bash
dotnet add package Npgsql
```

### Connexion à la base de données

```csharp
using Npgsql;

string connectionString = "Host=localhost;Username=postgres;Password=monmotdepasse;Database=mabasededonnees";
using var connection = new NpgsqlConnection(connectionString);
connection.Open();
```

::: tip
Dans les exemples j'ai utilisé la forme courte de `using var`introduite à partir de
[C# 8.0](https://learn.microsoft.com/fr-fr/dotnet/csharp/language-reference/statements/using)
pour simplifier la gestion des ressources qui implémentent `IDisposable`.

Si vous ne l'utilisez par encore elle se substitue à l'ancienne syntaxe suivante:

```csharp
using (var connection = new NpgsqlConnection(connectionString))
{
    connection.Open();
    // Code utilisant connection
} // connection est automatiquement "disposé" (fermé/libéré) ici

```

Pour plus de lisibilité dans les exemples suivants j'utiliserais également la nouvelle syntaxe,
et dans la mesure du possible je vous mettrais aussi l'ancienne syntaxe.
:::

### Exécution de requêtes SQL

#### Requête SELECT

::: code-group

```csharp [C# nouvelle syntaxe]
using var command = new NpgsqlCommand("SELECT * FROM clients WHERE id = @id", connection);
command.Parameters.AddWithValue("@id", 1);
using var reader = command.ExecuteReader();
while (reader.Read())
{
    Console.WriteLine(reader["nom"]);
}
```

```csharp [C# ancienne syntaxe]
using (var command = new NpgsqlCommand("SELECT * FROM clients WHERE id = @id", connection))
{
    command.Parameters.AddWithValue("@id", 1);
    using (var reader = command.ExecuteReader())
    {
        while (reader.Read())
        {
            Console.WriteLine(reader["nom"]);
        }
    }
}
```

:::

#### Requête INSERT/UPDATE/DELETE

::: code-group

```csharp [C# nouvelle syntaxe]
using var command = new NpgsqlCommand("INSERT INTO clients (nom, email) VALUES (@nom, @email)", connection);
command.Parameters.AddWithValue("@nom", "John Doe");
command.Parameters.AddWithValue("@email", "john.doe@example.com");
int rowsAffected = command.ExecuteNonQuery();
```

```csharp [C# ancienne syntaxe]
using (var command = new NpgsqlCommand("INSERT INTO clients (nom, email) VALUES (@nom, @email)", connection))
{
    command.Parameters.AddWithValue("@nom", "John Doe");
    command.Parameters.AddWithValue("@email", "john.doe@example.com");
    int rowsAffected = command.ExecuteNonQuery();
}
```

:::

### Transactions

::: code-group

```csharp [C# nouvelle syntaxe]
using var transaction = connection.BeginTransaction();
try
{
    // Exécutez vos requêtes ici
    transaction.Commit();
}
catch
{
    transaction.Rollback();
}
```

```csharp [C# ancienne syntaxe]
using (var transaction = connection.BeginTransaction())
{
    try
    {
        // Exécutez vos requêtes ici
        transaction.Commit();
    }
    catch
    {
        transaction.Rollback();
    }
}
```

:::

## Utilisation de Entity Framework Core (ORM)

### Installation

Ajoutez les packages NuGet suivants:

```bash
dotnet add package Npgsql.EntityFrameworkCore.PostgreSQL
dotnet add package Microsoft.EntityFrameworkCore.Design
```

### Configuration du contexte de base de données

Créez une classe `AppDbContext` qui hérite de `DbContext`:

```csharp
using Microsoft.EntityFrameworkCore;

public class AppDbContext : DbContext
{
    public DbSet<Client> Clients { get; set; }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseNpgsql("Host=localhost;Username=postgres;Password=monmotdepasse;Database=mabasededonnees");
    }
}

public class Client
{
    public int Id { get; set; }
    public string Nom { get; set; }
    public string Email { get; set; }
}
```

### Migration et création de la base de données

```bash
dotnet ef migrations add InitialCreate
dotnet ef database update
```

### Opérations CRUD avec Entity Framework

#### Ajouter un enregistrement

::: code-group

```csharp [C# nouvelle syntaxe]
using var context = new AppDbContext();
var client = new Client { Nom = "John doe", Email = "john.doe@example.com" };
context.Clients.Add(client);
context.SaveChanges();
```

```csharp [C# ancienne syntaxe]
using (var context = new AppDbContext())
{
    var client = new Client { Nom = "John doe", Email = "john.doe@example.com" };
    context.Clients.Add(client);
    context.SaveChanges();
}
```

:::

#### Lire des enregistrements

```csharp
var clients = context.Clients.Where(c => c.Nom.Contains("Doe")).ToList();
foreach (var c in clients)
{
    Console.WriteLine($"{c.Nom} - {c.Email}");
}
```

#### Mettre à jour un enregistrement

```csharp
var client = context.Clients.FirstOrDefault(c => c.Id == 1);
if (client != null)
{
    client.Email = "nouvel.email@example.com";
    context.SaveChanges();
}
```

#### Supprimer un enregistrement

```csharp
var client = context.Clients.FirstOrDefault(c => c.Id == 1);
if (client != null)
{
    context.Clients.Remove(client);
    context.SaveChanges();
}
```

## Comparaison : Npgsql vs Entity Framework Core

| **Critère**        | **Npgsql**                          | **Entity Framework Core**                |
|--------------------|-------------------------------------|------------------------------------------|
| **Contrôle**       | Requêtes SQL directes, contrôle fin | Abstraction via ORM, moins de contrôle   |
| **Productivité**   | Plus de code manuel                 | Moins de code, plus rapide à développer  |
| **Performance**    | Optimisé pour des requêtes complexes| Peut générer des requêtes moins optimales|
| **Maintenance**    | Plus complexe à maintenir           | Plus facile à maintenir                  |

## Bonnes pratiques

* **Sécurité** : Utilisez toujours des paramètres pour éviter les injections SQL.
* **Performance** : Avec Entity Framework, évitez le `ToList()` inutile et utilisez `AsNoTracking()` pour les lectures seules.
* **Transactions** : Utilisez des transactions pour garantir l’intégrité des données.

## Conclusion

* **Npgsql** est idéal pour des applications nécessitant un contrôle fin sur les requêtes SQL ou des optimisations spécifiques.
* **Entity Framework Core** est parfait pour des applications où la productivité et la maintenance sont prioritaires.

---

---
url: /programmation/rust.md
---

# Rust et PostgreSQL

Pour utiliser [Rust](https://rust-lang.org/ "Langage Rust") avec PostgreSQL, nous avons plusieurs bibliothèques disponibles.

Pour cette article, nous allons utiliser la crate [`postgres`](https://crates.io/crates/postgres) en mode synchrone
(ou plus souvent [`tokio-postgres`](https://crates.io/crates/tokio-postgres) pour les applications asynchrones)
en Rust pour interagir avec une base de données PostgreSQL.

Je ne détaille pas ici la création d'un nouveau projet, je vous laisse regarder la commande `cargo new` que vous trouverez
dans la [documentation officielle](https://doc.rust-lang.org/cargo/getting-started/first-steps.html "cargo new")

## Configuration de base

Le premier point est de déclarer les dépendances dans le fichier `Cargo.toml`.

### Ajouter les dépendances

Dans votre `Cargo.toml`:

```toml
[dependencies]
tokio = { version = "1.0", features = ["full"] }
tokio-postgres = { version = "0.7", features = ["with-uuid-1"] }
```

::: tip Astuces
La liste des `features` activable est disponible dans la documentation.
:::

## Connexion à la base de données

ensuite dans le fichier `main.rs`

### Exemple synchrone (avec `postgres`)

```rust
use postgres::{Client, NoTls, Error};

fn main() -> Result<(), Error> {
    // Chaîne de connexion
    let conn_str = "host=localhost user=postgres dbname=mydb password=1234";
    let mut client = Client::connect(conn_str, NoTls)?;

    // Exécution d'une requête simple pour récupérer la PK et le nom de l'utilisateur
    for row in client.query("SELECT id, name FROM users", &[])? {
        let id: i32 = row.get(0);
        let name: String = row.get(1);
        println!("id: {}, name: {}", id, name);
    }

    Ok(())
}
```

::: tip Remarques
Ici les informations de connexion sont connectés en dur, vous pouvez par exemple les transmettre en variables d'environnement
et utiliser le [module standard](https://doc.rust-lang.org/std/env/index.html "std::env") `std::env`
:::

### Exemple asynchrone (avec `tokio-postgres`)

```rust
use tokio_postgres::{NoTls, Error};

#[tokio::main]
async fn main() -> Result<(), Error> {
    // Chaîne de connexion
    let conn_str = "host=localhost user=postgres dbname=mydb password=1234";
    let (client, connection) = tokio_postgres::connect(conn_str, NoTls).await?;

    // Exécution de la connexion en arrière-plan
    tokio::spawn(async move {
        if let Err(e) = connection.await {
            eprintln!("Erreur de connexion: {}", e);
        }
    });

    // Exécution d'une requête simple
    let rows = client.query("SELECT id, name FROM users", &[]).await?;
    for row in rows {
        let id: i32 = row.get(0);
        let name: String = row.get(1);
        println!("id: {}, name: {}", id, name);
    }

    Ok(())
}
```

## Requêtes paramétrées

Les requêtes paramétrés sont el moyen le plus sur d'éviter les failles d'injections SQL.

### Insertion de données

```rust
let name = "Alice";
let age = 30;
client.execute(
    "INSERT INTO users (name, age) VALUES ($1, $2)",
    &[&name, &age],
).await?;
```

### Sélection avec filtre

```rust
let min_age = 25;
let rows = client.query(
    "SELECT name FROM users WHERE age > $1",
    &[&min_age],
).await?;
```

## Transactions

```rust
let transaction = client.transaction().await?;
transaction.execute("INSERT INTO users (name) VALUES ($1)", &[&"Bob"]).await?;
transaction.execute("UPDATE users SET age = $1 WHERE name = $2", &[&40, &"Bob"]).await?;
transaction.commit().await?;

// Ou utiliser transaction.rollback().await?; (ou savepoint)
```

::: tip Remarques
Pour plus d'informations concernant les transactions, vous pouvez consulter la [documentation](https://docs.rs/tokio-postgres/latest/tokio_postgres/struct.Transaction.html "Transaction PostgreSQL en Rust").
:::

## Gestion des erreurs

Il ne faut pas non plus oublier la gestion des erreurs.

```rust
match client.query_one("SELECT name FROM users WHERE id = $1", &[&1]).await {
    Ok(row) => {
        let name: String = row.get(0);
        println!("Nom: {}", name);
    }
    Err(e) => eprintln!("Erreur: {}", e),
}
```

## Utilisation de types personnalisés

Si vous utilisez des types PostgreSQL spécifiques (comme `UUID`), assurez-vous d'activer les features appropriées dans `Cargo.toml` :

```toml
tokio-postgres = { version = "0.7", features = ["with-uuid-1"] }
```

Exemple d'utilisation :

```rust
use uuid::Uuid;

let id = Uuid::new_v4();
client.execute(
    "INSERT INTO users (id, name) VALUES ($1, $2)",
    &[&id, &"Charlie"],
).await?;
```

## Pool de connexions (avec `bb8`)

Pour gérer un pool de connexions, nous allons ajouter les crates `bb8` et `bb8-postgres` à nos dépendances, ajouter ceci dans le fichier `Cargo.toml`

```toml
bb8 = "0.8"
bb8-postgres = "0.8"
```

Exemple :

```rust
use bb8_postgres::PostgresConnectionManager;
use bb8::Pool;

type PgPool = Pool<PostgresConnectionManager<NoTls>>;

#[tokio::main]
async fn main() -> Result<(), Error> {
    let manager = PostgresConnectionManager::new_from_stringlike(
        "host=localhost user=postgres dbname=mydb password=1234",
        NoTls,
    )?;
    let pool = Pool::builder().build(manager).await?;

    let conn = pool.get().await?;
    let rows = conn.query("SELECT id, name FROM users", &[]).await?;
    // ...
    Ok(())
}
```

## Exemple complet (asynchrone)

```rust
use tokio_postgres::{NoTls, Error};

#[tokio::main]
async fn main() -> Result<(), Error> {
    let (client, connection) = tokio_postgres::connect(
        "host=localhost user=postgres dbname=mydb password=1234",
        NoTls,
    ).await?;

    tokio::spawn(async move {
        if let Err(e) = connection.await {
            eprintln!("Erreur de connexion: {}", e);
        }
    });

    // Création d'une table
    client.execute(
        "CREATE TABLE IF NOT EXISTS users (
            id SERIAL PRIMARY KEY,
            name VARCHAR NOT NULL,
            age INTEGER
        )",
        &[],
    ).await?;

    // Insertion
    client.execute(
        "INSERT INTO users (name, age) VALUES ($1, $2)",
        &[&"Alice", &30],
    ).await?;

    // Sélection
    let rows = client.query("SELECT id, name, age FROM users", &[]).await?;
    for row in rows {
        let id: i32 = row.get(0);
        let name: String = row.get(1);
        let age: i32 = row.get(2);
        println!("id: {}, name: {}, age: {}", id, name, age);
    }

    Ok(())
}
```

## Correspondance

Ci dessous vous trouverez un tableau de correspondance des types entre PostgreSQL et Rust (avec les crates `postgres`/`tokio-postgres`)

::: warning
Si vous utiliser d'autres bibliothèques, il se peut que certains type puisse différé légèrement
:::

| Type PostgreSQL       | Type Rust (crate `postgres`/`tokio-postgres`) | Remarques                                                                 |
|:---------------------:|:---------------------------------------------:|---------------------------------------------------------------------------|
| `SMALLINT`            | `i16`                                         | Entier 16 bits                                                            |
| `INTEGER`             | `i32`                                         | Entier 32 bits                                                            |
| `BIGINT`              | `i64`                                         | Entier 64 bits                                                            |
| `SERIAL`              | `i32`                                         | Auto-incrément (entier 32 bits)                                           |
| `BIGSERIAL`           | `i64`                                         | Auto-incrément (entier 64 bits)                                           |
| `REAL`                | `f32`                                         | Nombre à virgule flottante 32 bits                                        |
| `DOUBLE PRECISION`    | `f64`                                         | Nombre à virgule flottante 64 bits                                        |
| `NUMERIC`             | `rust_decimal::Decimal`                       | Requiert la crate `rust_decimal` pour une précision arbitraire            |
| `BOOLEAN`             | `bool`                                        | Vrai/Faux                                                                 |
| `CHAR(N)`/`VARCHAR(N)`| `String`                                      | Chaîne de caractères                                                      |
| `TEXT`                | `String`                                      | Chaîne de caractères de taille illimitée                                  |
| `BYTEA`               | `Vec<u8>`                                     | Tableau d'octets                                                          |
| `DATE`                | `chrono::NaiveDate`                           | Requiert la crate `chrono`                                                |
| `TIME`                | `chrono::NaiveTime`                           | Requiert la crate `chrono`                                                |
| `TIMESTAMP`           | `chrono::NaiveDateTime`                       | Requiert la crate `chrono`                                                |
| `TIMESTAMPTZ`         | `chrono::DateTime<Utc>`                       | Requiert la crate `chrono`                                                |
| `INTERVAL`            | `postgres_types::Interval`                    | Type spécifique à PostgreSQL                                              |
| `UUID`                | `uuid::Uuid`                                  | Requiert la feature `with-uuid-1` et la crate `uuid`                      |
| `JSON`/`JSONB`        | `serde_json::Value`                           | Requiert la feature `with-serde_json-1` et la crate `serde_json`          |
| `ARRAY`               | `Vec<T>`                                      | Où `T` est le type des éléments du tableau                                |
| `INET`/`CIDR`         | `std::net::IpAddr`/`std::net::IpNet`          | Pour les adresses IP et réseaux                                           |
| `POINT`               | `(f64, f64)` ou structure personnalisée       | Coordonnées géométriques                                                  |
| `ENUM`                | `String` ou enum Rust                         | Nécessite une conversion manuelle                                         |

***

### Remarques importantes :

* **Types temporels** : La crate `chrono` est couramment utilisée pour manipuler les dates et heures.
* **Types décimaux** : Pour `NUMERIC`, utilisez `rust_decimal::Decimal` pour éviter les problèmes de précision.
* **UUID** : Activez la feature `with-uuid-1` dans `tokio-postgres` pour supporter les UUID.
* **JSON** : Activez la feature `with-serde_json-1` pour manipuler les types JSON/JSONB.
* **Types géométriques** : Les types comme `POINT` peuvent être mappés à des tuples ou des structures Rust.

## Points clés à retenir

* **Sécurité** : Utiliser le plus fréquement possible des requêtes paramétrées pour éviter les injections SQL.
* **Asynchrone** : Préférez `tokio-postgres` pour les applications asynchrones.
* **Pool de connexions** : Utilisez `bb8` pour gérer efficacement les connexions en production.
* **Types personnalisés** : Activez les features nécessaires pour les types comme `UUID`.

---

---
url: /programmation/java.md
description: Utilisation de Java pour se connecter à une base de données PostgreSQL
---

# Langage Java

## Introduction

Java est un langage de programmation **orienté objet**, **portable** et **sécurisé**,
créé en 1995 par Sun Microsystems (aujourd’hui propriété d’Oracle).

Il repose sur le principe **"Write Once, Run Anywhere"** (WORA), grâce à la **Java Virtual Machine (JVM)**,
qui permet d’exécuter du code compilé (bytecode) sur n’importe quel système d’exploitation.

Java est largement utilisé pour développer des **applications d’entreprise**, des **applications web** (avec Spring, Jakarta EE),
des **applications mobiles** (Android), et des **systèmes embarqués**. Ses principales caractéristiques incluent :

* **La syntaxe simple et structurée**, inspirée du C++ mais sans sa complexité (pas de pointeurs, gestion automatique de la mémoire via le **garbage collector**).
* **La robustesse** : gestion stricte des types, exceptions, et vérifications à la compilation/exécution.
* **La sécurité** : sandboxing, gestion des permissions, et absence de vulnérabilités liées à la gestion manuelle de la mémoire.
* **Une riche bibliothèque standard** (Java API) pour les E/S, réseaux, collections, concurrency, etc.

Java est aussi un écosystème mature avec des outils comme `Maven` ou `Gradle` (ou plus ancien comme `ANT`) pour la gestion des dépendances,
et des frameworks comme **Spring** ou **Hibernate** pour simplifier le développement.

## Connexion au base de données

Pour se connecter au base de données, Java a implémenté la spécification `JDBC` pour la conception de driver.
Plusieurs version sont apparus au fil des années suivant l'évolution du langage.

### Résumé des versions de JDBC

| Version | Année | Java SE | Principales nouveautés |
|:-------:|:-----:|:-------:|------------------------|
| **JDBC 1.0** | 1997 | JDK 1.1 | Première version, API de base pour la connexion aux bases de données, `DriverManager`, `Connection`, `Statement`, `ResultSet`. |
| **JDBC 2.0** | 1999 | JDK 1.2/1.3 | Ajout des **ResultSet scrollables** (navigation bidirectionnelle), **ResultSet updatable**, **Batch Updates**, et introduction de l’API `javax.sql` (DataSource, Connection Pooling, RowSet). |
| **JDBC 3.0** | 2002 | JDK 1.4 | **Savepoints** (pour les transactions imbriquées), amélioration des `PreparedStatement`, support des **BLOB/CLOB**, et métadonnées étendues. |
| **JDBC 4.0** | 2006 | Java SE 6 | **Auto-loading des pilotes** (plus besoin de `Class.forName`), support des **SQL XML**, amélioration des `RowSet`, et intégration avec Java EE. |
| **JDBC 4.1** | 2011 | Java SE 7 | Support des **try-with-resources** (AutoCloseable), amélioration des `RowSet`, et gestion simplifiée des exceptions. |
| **JDBC 4.2** | 2014 | Java SE 8 | Support des **REF\_CURSOR** (Oracle), amélioration des `RowSet`, et compatibilité avec les nouvelles fonctionnalités de Java 8 (comme les streams pour `ResultSet`). |
| **JDBC 4.3** | 2017 | Java SE 9 | Support des **nouvelles API de date/heure** (`java.time`), méthodes `getObject` avec mapping automatique vers les types Java 8, et amélioration de la gestion des shards (bases de données partitionnées). |
| **JDBC 4.4** | 2021 | Java SE 17 (LTS) | Support des **SQL:2016**, amélioration des **mappages de types**, et optimisations pour les applications cloud/natives. |

### Points clés à retenir

* **JDBC 4.0** a marqué un tournant avec l’auto-chargement des pilotes et une meilleure intégration avec Java SE.
* **JDBC 4.2/4.3** ont apporté des améliorations pour les applications modernes, notamment avec Java 8 et les API de date/heure.
* **JDBC 4.4** est la version la plus récente (inclus dans Java 17+), avec un focus sur la compatibilité avec les bases de données cloud et les standards SQL récents.

## JDBC et PostgreSQL

Pour se connecter à `PostgreSQL` en Java nous utiliseront le driver
[JDBC](https://fr.wikipedia.org/wiki/Java_Database_Connectivity) qui
fournit une interface de programmation standard, et est developpé par la communauté PostgreSQL.

* [driver JDBC pour PostgreSQL](https://jdbc.postgresql.org/download/)

:::: warning
Il faut sélectionner le driver [JDBC](https://fr.wikipedia.org/wiki/Java_Database_Connectivity)
qui correspond a votre version de PostgreSQL mais aussi à votre version de Java.
::::

## Configuration de la connexion à PostgreSQL en Java

Pour interagir avec PostgreSQL, utilisez le **pilote JDBC** officiel.

### Déclarer la dépendance

#### Avec Maven (`pom.xml`)

```xml
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.6.0</version> <!-- Vérifiez la dernière version -->
</dependency>
```

#### Avec Gradle (`build.gradle`)

```groovy
dependencies {
    implementation 'org.postgresql:postgresql:42.6.0'
}
```

## Exemple de code Java pour se connecter et exécuter des requêtes

### Connexion à la base de données

```java
import java.sql.*;

public class PostgreSQLExample {
    private static final String URL = "jdbc:postgresql://localhost:5432/nom_de_la_base";
    private static final String USER = "utilisateur";
    private static final String PASSWORD = "mot_de_passe";

    public static void main(String[] args) {
        try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD)) {
            System.out.println("Connexion réussie à PostgreSQL!");

            // Exemple de requête SELECT
            String sql = "SELECT * FROM clients";
            try (Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery(sql)) {

                while (rs.next()) {
                    System.out.println("ID: " + rs.getInt("id") +
                                       ", Nom: " + rs.getString("nom"));
                }
            }

            // Exemple de requête INSERT
            String insertSql = "INSERT INTO clients (nom, email) VALUES (?, ?)";
            try (PreparedStatement pstmt = conn.prepareStatement(insertSql)) {
                pstmt.setString(1, "Dupont");
                pstmt.setString(2, "dupont@example.com");
                pstmt.executeUpdate();
                System.out.println("Nouveau client ajouté!");
            }

        } catch (SQLException e) {
            System.err.println("Erreur de connexion: " + e.getMessage());
        }
    }
}
```

## Bonnes pratiques

* **Gestion des ressources**: Utilisez `try-with-resources` pour fermer automatiquement les connexions, statements et resultsets.
* **Requêtes préparées**: Préférez `PreparedStatement` pour éviter les injections SQL.
* **Pool de connexions**: Pour les applications web, utilisez un pool de connexions comme **HikariCP** (intégré à Spring Boot par défaut).

## Pool de connexion (HikariCP)

**HikariCP** est un **pool de connexions JDBC** ultra-rapide, léger et conçu pour les applications Java modernes.
Il est devenu le standard de facto pour la gestion des connexions à une base de données, notamment avec **PostgreSQL**,
grâce à sa performance, sa simplicité et sa fiabilité.

### Pourquoi utiliser HikariCP ?

* **Performance** : HikariCP est jusqu’à **10 fois plus rapide** que d’autres pools comme Apache DBCP ou C3P0.
* **Léger** : Moins de 130 Ko, sans dépendances lourdes.
* **Optimisé pour la production** : Gestion intelligente des connexions, des timeouts, et des fuites de mémoire.
* **Intégré par défaut** dans Spring Boot, Quarkus, et d’autres frameworks modernes.

### Ajouter la dépendance

#### Avec Maven (`pom.xml`)

```xml
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version> <!-- Vérifiez la dernière version -->
</dependency>
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.6.0</version> <!-- Pilote JDBC pour PostgreSQL -->
</dependency>
```

#### Avec Gradle (`build.gradle`)

```groovy
implementation 'com.zaxxer:HikariCP:5.0.1'
implementation 'org.postgresql:postgresql:42.6.0'
```

### Code Java

```java
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class PostgreSQLPoolExample {
    public static void main(String[] args) {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:postgresql://localhost:5432/nom_de_la_base");
        config.setUsername("utilisateur");
        config.setPassword("mot_de_passe");
        config.setMaximumPoolSize(10);

        try (HikariDataSource ds = new HikariDataSource(config);
             Connection conn = ds.getConnection()) {

            // Utilisez la connexion comme avant
            String sql = "SELECT * FROM clients";
            try (Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery(sql)) {
                while (rs.next()) {
                    System.out.println("ID: " + rs.getInt("id"));
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
```

### Bonnes pratiques avec HikariCP

* **Taille du pool** :
  * `maximumPoolSize` : Dépend de votre charge. Pour la plupart des applications, **10 à 20** connexions suffisent.
  * Évitez de surdimensionner le pool (risque de surcharge du serveur PostgreSQL).
* **Timeouts** :
  * `connectionTimeout` : Temps max pour obtenir une connexion (évite les attentes infinies).
  * `maxLifetime` : Limite la durée de vie d’une connexion pour éviter les problèmes de stagnation.
* **Validation des connexions** :
  * Activez `connectionTestQuery` pour vérifier la validité des connexions avant utilisation :
    ```java
    config.setConnectionTestQuery("SELECT 1");
    ```
* **Journalisation** :
  * HikariCP fournit des métriques détaillées (nombre de connexions actives, temps d’attente, etc.). Activez les logs pour le débogage :
    ```java
    config.setLeakDetectionThreshold(60000); // Détection des fuites après 60s
    ```

### Avantages spécifiques avec PostgreSQL

* **Compatibilité totale** : HikariCP fonctionne parfaitement avec le pilote JDBC de PostgreSQL.
* **Gestion des transactions** : Intègre naturellement avec les transactions JDBC et les frameworks comme Spring Transaction.
* **Support des fonctionnalités avancées** : Comme les `PreparedStatement` en cache, les requêtes batch, et les types de données spécifiques à PostgreSQL (JSONB, UUID, etc.).

### Résumé des paramètres clés

| Paramètre | Description | Valeur recommandée |
|:----------|-------------|:-----------------:|
| `maximumPoolSize` | Nombre max de connexions | 10-20 |
| `minimumIdle` | Nombre min de connexions inactives | 5 |
| `idleTimeout` | Temps max d’inactivité (ms) | 30000 |
| `connectionTimeout` | Timeout pour obtenir une connexion (ms) | 30000 |
| `maxLifetime` | Durée de vie max d’une connexion (ms) | 1800000 (30 min) |
| `connectionTestQuery` | Requête de validation | `SELECT 1` |

### Configuration avec Spring Boot

Si vous utilisez **Spring Boot**, HikariCP est le pool par défaut. Il suffit de configurer `application.properties` :

```properties
# PostgreSQL
spring.datasource.url=jdbc:postgresql://localhost:5432/ma_base
spring.datasource.username=utilisateur
spring.datasource.password=mot_de_passe
spring.datasource.driver-class-name=org.postgresql.Driver

# HikariCP (paramètres optionnels)
spring.datasource.hikari.maximum-pool-size=10
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.max-lifetime=1800000
```

### Quand utiliser HikariCP ?

* **Applications web** (Spring Boot, Jakarta EE, Micronaut, Quarkus).
* **Microservices** nécessitant des connexions rapides et fiables.
* **Environnements cloud** où la latence et la scalabilité sont critiques.

## Intégration avec Spring Boot

Si vous utilisez **Spring Boot**, la configuration est simplifiée via `application.properties`:

```properties
spring.datasource.url=jdbc:postgresql://localhost:5432/nom_de_la_base
spring.datasource.username=utilisateur
spring.datasource.password=mot_de_passe
spring.datasource.driver-class-name=org.postgresql.Driver
```

Spring Boot gère automatiquement le pool de connexions avec HikariCP.

## Résumé des étapes clés

| Étape | Action |
|:-----:|:-------|
| **1** | Ajouter la dépendance PostgreSQL (Maven/Gradle) |
| **2** | Charger le pilote JDBC et établir la connexion |
| **3** | Exécuter des requêtes (SELECT, INSERT, UPDATE, DELETE) |
| **4** | Utiliser des requêtes préparées pour la sécurité |
| **5** | Gérer les ressources avec `try-with-resources` |
| **6** | (Optionnel) Configurer un pool de connexions (HikariCP) |

---

---
url: /programmation/php.md
description: Etablissement d'une connexion à PostgreSQL en PHP et le driver PDO PgSQL
---

# Langage PHP

## Bibliothèques

* [Librairie officiel
  native](https://www.php.net/manual/fr/book.pgsql.php)
* [Librairie PDO](https://php.net/manual/fr/book.pdo.php)

## Gestionnaire de modèle

* [POMM](https://github.com/chanmix51/Pomm)

## Configuration

Pour activer l'extension PDO pour PostgreSQL, il faut editer le fichier php.ini, trouver la ligne ci-dessous

```ini
extension=php_pdo_pgsql.dll
```

enlever le **;** qui est un commentaire pour activer l'extension.

Une fois l'extension activée (vérifiable avec un **phpinfo()** ), nous pouvons commencer à utiliser PostgreSQL avec PHP et PDO

## Pourquoi utiliser PDO avec PostgreSQL ?

PDO (PHP Data Objects) est une extension PHP qui offre une interface unifiée pour interagir avec différentes bases de données, dont PostgreSQL. Ses avantages :

* **Sécurité** : Protection contre les injections SQL via les requêtes préparées.
* **Portabilité** : Code facilement adaptable à d’autres SGBD (MySQL, SQLite, etc.).
* **Performance** : Gestion optimisée des connexions et des requêtes.

### Prérequis

* Un serveur web avec PHP (version 7.4 ou supérieure recommandée).
* L’extension PDO et le driver PDO\_PGSQL activés dans `php.ini` :
  ```ini
  extension=pdo
  extension=pdo_pgsql
  ```
* Un serveur PostgreSQL accessible (local ou distant).

## Connexion à PostgreSQL avec PDO

### Exemple de connexion

```php
<?php
// Paramètres de connexion
$host = 'localhost';      // Adresse du serveur PostgreSQL
$dbname = 'nom_base';     // Nom de la base de données
$user = 'utilisateur';    // Nom d'utilisateur
$password = 'motdepasse'; // Mot de passe

try {
    // Chaîne de connexion PDO
    $dsn = "pgsql:host=$host;dbname=$dbname;port=5432";

    // Création de la connexion
    $pdo = new PDO($dsn, $user, $password);

    // Configuration pour afficher les erreurs PDO
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "Connexion à PostgreSQL réussie !";
} catch (PDOException $e) {
    // Gestion des erreurs
    die("Erreur de connexion : " . $e->getMessage());
}
?>
```

## Exécution de requêtes

### Requête simple (SELECT)

```php
try {
    $sql = "SELECT * FROM clients WHERE age > :age";
    $stmt = $pdo->prepare($sql);

    // Liaison des paramètres
    $age_min = 18;
    $stmt->bindParam(':age', $age_min, PDO::PARAM_INT);

    // Exécution
    $stmt->execute();

    // Récupération des résultats
    $clients = $stmt->fetchAll(PDO::FETCH_ASSOC);

    // Affichage
    foreach ($clients as $client) {
        echo "Nom : " . $client['nom'] . ", Âge : " . $client['age'] . "<br>";
    }
} catch (PDOException $e) {
    echo "Erreur : " . $e->getMessage();
}
```

### Insertion de données (INSERT)

```php
try {
    $sql = "INSERT INTO clients (nom, email, age) VALUES (:nom, :email, :age)";
    $stmt = $pdo->prepare($sql);

    // Données à insérer
    $nom = "Dupont";
    $email = "dupont@example.com";
    $age = 30;

    // Liaison des paramètres
    $stmt->bindParam(':nom', $nom);
    $stmt->bindParam(':email', $email);
    $stmt->bindParam(':age', $age);

    // Exécution
    $stmt->execute();

    echo "Client ajouté avec succès !";
} catch (PDOException $e) {
    echo "Erreur : " . $e->getMessage();
}
```

### Mise à jour (UPDATE)

```php
try {
    $sql = "UPDATE clients SET email = :email WHERE id = :id";
    $stmt = $pdo->prepare($sql);

    // Données à mettre à jour
    $id = 1;
    $nouvel_email = "nouvel_email@example.com";

    // Liaison des paramètres
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);
    $stmt->bindParam(':email', $nouvel_email);

    // Exécution
    $stmt->execute();

    echo "Email mis à jour !";
} catch (PDOException $e) {
    echo "Erreur : " . $e->getMessage();
}
```

### Suppression (DELETE)

```php
try {
    $sql = "DELETE FROM clients WHERE id = :id";
    $stmt = $pdo->prepare($sql);

    // ID du client à supprimer
    $id = 1;
    $stmt->bindParam(':id', $id, PDO::PARAM_INT);

    // Exécution
    $stmt->execute();

    echo "Client supprimé !";
} catch (PDOException $e) {
    echo "Erreur : " . $e->getMessage();
}
```

## Transactions

Les transactions permettent de regrouper plusieurs requêtes en un bloc atomique (tout est exécuté ou rien).

```php
try {
    $pdo->beginTransaction();

    // Exemple : Transfert d'argent entre deux comptes
    $sql1 = "UPDATE comptes SET solde = solde - 100 WHERE id = 1";
    $sql2 = "UPDATE comptes SET solde = solde + 100 WHERE id = 2";

    $pdo->exec($sql1);
    $pdo->exec($sql2);

    // Validation de la transaction
    $pdo->commit();
    echo "Transaction effectuée avec succès !";
} catch (PDOException $e) {
    // Annulation en cas d'erreur
    $pdo->rollBack();
    echo "Erreur : " . $e->getMessage();
}
```

## Bonnes pratiques

* **Toujours utiliser des requêtes préparées** pour éviter les injections SQL.
* **Gérer les erreurs** avec des blocs `try/catch`.
* **Fermer les connexions** : PDO ferme automatiquement la connexion à la fin du script, mais vous pouvez forcer la fermeture avec `$pdo = null;`.
* **Utiliser des transactions** pour les opérations critiques.

## Ressources utiles

* [Documentation officielle PDO](https://www.php.net/manual/fr/book.pdo.php)
* [PostgreSQL + PHP : Guide complet](https://www.postgresql.org/docs/current/libpq-connect.html)

---

---
url: /programmation/python.md
description: Programmation en langage python avec diverses bibliothèques
---

# Langage Python {#langage\_python}

## Pourquoi utiliser Python avec PostgreSQL ?

Python est un langage populaire pour interagir avec PostgreSQL grâce à sa simplicité et à ses bibliothèques dédiées. Les principales bibliothèques sont :

* **psycopg2** : La plus utilisée, stable et mature.
* **psycopg3** : Nouvelle version, plus rapide et moderne.
* **asyncpg** : Pour les applications asynchrones (avec `async/await`).

## Installation des bibliothèques

```bash
pip install psycopg2-binary  # psycopg2 (version binaire pour simplifier l'installation)
pip install psycopg          # psycopg3
pip install asyncpg          # asyncpg
```

::: tip
Depuis quelques temps il n'est plus necessaire de préciser binary dans l'installation de psycopg2
:::

## Utilisation de psycopg2

### Connexion à la base de données

```python
import psycopg2

# Paramètres de connexion
conn_params = {
    "host": "localhost",
    "database": "nom_base",
    "user": "utilisateur",
    "password": "motdepasse",
    "port": "5432"
}

try:
    # Établir la connexion
    conn = psycopg2.connect(**conn_params)
    print("Connexion réussie à PostgreSQL !")

    # Créer un curseur
    cur = conn.cursor()

    # Exemple de requête
    cur.execute("SELECT version();")
    version = cur.fetchone()
    print("Version de PostgreSQL :", version)

except psycopg2.Error as e:
    print("Erreur de connexion :", e)

finally:
    # Fermer le curseur et la connexion
    if 'cur' in locals():
        cur.close()
    if 'conn' in locals():
        conn.close()
```

### Requêtes paramétrées (éviter les injections SQL)

```python
def ajouter_client(nom, email, age):
    try:
        conn = psycopg2.connect(**conn_params)
        cur = conn.cursor()

        # Requête paramétrée
        query = "INSERT INTO clients (nom, email, age) VALUES (%s, %s, %s) RETURNING id;"
        cur.execute(query, (nom, email, age))

        # Récupérer l'ID du client inséré
        client_id = cur.fetchone()[0]
        conn.commit()
        print(f"Client ajouté avec l'ID : {client_id}")

    except psycopg2.Error as e:
        conn.rollback()
        print("Erreur :", e)
    finally:
        if 'cur' in locals():
            cur.close()
        if 'conn' in locals():
            conn.close()

ajouter_client("Dupont", "dupont@example.com", 30)
```

### Récupération de données

```python
def lister_clients():
    try:
        conn = psycopg2.connect(**conn_params)
        cur = conn.cursor()

        cur.execute("SELECT id, nom, email FROM clients;")
        clients = cur.fetchall()

        for client in clients:
            print(f"ID: {client[0]}, Nom: {client[1]}, Email: {client[2]}")

    except psycopg2.Error as e:
        print("Erreur :", e)
    finally:
        if 'cur' in locals():
            cur.close()
        if 'conn' in locals():
            conn.close()

lister_clients()
```

## Utilisation de psycopg3

**psycopg3** est une réécriture moderne de psycopg2, plus rapide et avec une API plus intuitive.

### Connexion et requête simple

```python
import psycopg

conn_params = "host=localhost dbname=nom_base user=utilisateur password=motdepasse"

try:
    # Connexion et création d'un curseur
    with psycopg.connect(conn_params) as conn:
        with conn.cursor() as cur:
            cur.execute("SELECT version();")
            version = cur.fetchone()
            print("Version de PostgreSQL :", version)

except psycopg.Error as e:
    print("Erreur :", e)
```

### Requête paramétrée et transaction

```python
def ajouter_client_psycopg3(nom, email, age):
    try:
        with psycopg.connect(conn_params) as conn:
            with conn.cursor() as cur:
                query = "INSERT INTO clients (nom, email, age) VALUES (%s, %s, %s) RETURNING id;"
                cur.execute(query, (nom, email, age))
                client_id = cur.fetchone()[0]
                conn.commit()
                print(f"Client ajouté avec l'ID : {client_id}")

    except psycopg.Error as e:
        print("Erreur :", e)

ajouter_client_psycopg3("Martin", "martin@example.com", 25)
```

## Utilisation de asyncpg (asynchrone)

**asyncpg** est conçu pour les applications asynchrones, utilisant `async/await`.

### Connexion et requête asynchrone

```python
import asyncio
import asyncpg

async def test_connexion():
    conn_params = {
        "host": "localhost",
        "database": "nom_base",
        "user": "utilisateur",
        "password": "motdepasse",
        "port": "5432"
    }

    try:
        # Connexion asynchrone
        conn = await asyncpg.connect(**conn_params)
        print("Connexion asynchrone réussie !")

        # Exécution d'une requête
        version = await conn.fetchval("SELECT version();")
        print("Version de PostgreSQL :", version)

    except asyncpg.PostgresError as e:
        print("Erreur :", e)
    finally:
        if 'conn' in locals():
            await conn.close()

# Exécuter la fonction asynchrone
asyncio.run(test_connexion())
```

### Insertion asynchrone

```python
async def ajouter_client_async(nom, email, age):
    conn_params = {
        "host": "localhost",
        "database": "nom_base",
        "user": "utilisateur",
        "password": "motdepasse",
        "port": "5432"
    }

    try:
        conn = await asyncpg.connect(**conn_params)
        query = "INSERT INTO clients (nom, email, age) VALUES ($1, $2, $3) RETURNING id;"
        client_id = await conn.fetchval(query, nom, email, age)
        print(f"Client ajouté avec l'ID : {client_id}")

    except asyncpg.PostgresError as e:
        print("Erreur :", e)
    finally:
        if 'conn' in locals():
            await conn.close()

# Exécuter
asyncio.run(ajouter_client_async("Bernard", "bernard@example.com", 40))
```

### Récupération asynchrone de données

```python
async def lister_clients_async():
    conn_params = {
        "host": "localhost",
        "database": "nom_base",
        "user": "utilisateur",
        "password": "motdepasse",
        "port": "5432"
    }

    try:
        conn = await asyncpg.connect(**conn_params)
        clients = await conn.fetch("SELECT id, nom, email FROM clients;")

        for client in clients:
            print(f"ID: {client['id']}, Nom: {client['nom']}, Email: {client['email']}")

    except asyncpg.PostgresError as e:
        print("Erreur :", e)
    finally:
        if 'conn' in locals():
            await conn.close()

# Exécuter
asyncio.run(lister_clients_async())
```

## Comparatif des bibliothèques

| Fonctionnalité          | psycopg2               | psycopg3               | asyncpg                |
|-------------------------|------------------------|------------------------|------------------------|
| **Type**                | Synchrone              | Synchrone              | Asynchrone             |
| **Performance**         | Bonne                  | Meilleure              | Excellente (async)     |
| **API**                 | Classique              | Moderne                | Asynchrone             |
| **Transactions**        | Oui                    | Oui                    | Oui                    |
| **Requêtes paramétrées**| Oui (`%s`)             | Oui (`%s`)             | Oui (`$1`, `$2`)       |
| **Pool de connexions**  | Non (nécessite un module externe) | Oui (intégré) | Oui (intégré) |

## Bonnes pratiques

* **Toujours utiliser des requêtes paramétrées** pour éviter les injections SQL.
* **Gérer les exceptions** pour éviter les plantages silencieux.
* **Fermer les connexions** après utilisation (ou utiliser `with` pour psycopg3).
* **Pour les applications web asynchrones**, privilégier `asyncpg`.
* **Pour les scripts synchrones**, `psycopg3` est un excellent choix moderne.

## Ressources utiles

* [Documentation psycopg2](https://www.psycopg.org/docs/)
* [Documentation psycopg3](https://www.psycopg.org/psycopg3/docs/)
* [Documentation asyncpg](https://magic.io/blog/asyncpg-1m-row/)

---

---
url: /programmation/plpgsql.md
description: Programmation en langage procédural avec PLpgSQL
---

# Langage PLpgSQL {#langage\_plpgsql}

[PL/pgSQL](https://docs.postgresql.fr/17/plpgsql.html) (Procedural
Language/PostgreSQL) est un langage de programmation procédural pris en
charge par le SGBDR **PostgreSQL**.

Il ressemble beaucoup au langage PL/SQL d'Oracle. Implémenté par Jan
Wieck, PL/pgSQL est apparu pour la première fois avec PostgreSQL 6.4,
publié le 30 octobre 1998.

La version 9 implémente également certaines fonctionnalités ISO SQL/PSM,
comme la surcharge des fonctions et procédures invoquées par SQL.

PL/pgSQL, en tant que langage de programmation complet, permet un
contrôle procédural beaucoup plus important que SQL, y compris la
possibilité d'utiliser des boucles et d'autres structures de contrôle.

Les instructions et déclencheurs SQL peuvent appeler des fonctions
créées dans le langage [PL/pgSQL](https://docs.postgresql.fr/17/plpgsql.html).

La conception de [PL/pgSQL](https://docs.postgresql.fr/17/plpgsql.html)
visait à permettre aux utilisateurs de PostgreSQL d'effectuer des
opérations et des calculs plus complexes que SQL, tout en offrant une
facilité d'utilisation.

Le langage peut être défini comme approuvé par le serveur.

[PL/pgSQL](https://docs.postgresql.fr/17/plpgsql.html) est l'un des
langages de programmation inclus dans la distribution standard de
PostgreSQL, les autres étant PL/Tcl, PL/Perl et PL/Python. De plus, de
nombreux autres sont disponibles auprès de tiers, notamment PL/Java,
PL/pgPSM, PL/php, PL/R, PL/Ruby, PL/sh, PL/Lua, Postmodern (basé sur
Common Lisp) et PL/v8.

PostgreSQL utilise Bison comme analyseur, ce qui facilite le portage de
nombreux langages open source, ainsi que la réutilisation du code.

## Avantages

* **Performance** : Réduction des allers-retours entre l’application et la base.
* **Modularité** : Encapsulation de la logique métier dans la base.
* **Sécurité** : Contrôle fin des droits d’accès.

## Structure de base d’un bloc PL/pgSQL

Un bloc PL/pgSQL est délimité par des mots-clés et peut contenir des déclarations, des instructions, et des exceptions.

```sql
[ <<étiquette>> ]
DECLARE
    -- Déclarations des variables, curseurs, etc.
BEGIN
    -- Instructions SQL et PL/pgSQL
EXCEPTION
    -- Gestion des erreurs
END;
```

## Déclarations

### Variables

Les variables sont déclarées dans la section `DECLARE` et peuvent être de n’importe quel type PostgreSQL.

```sql
DECLARE
    ma_variable INTEGER;
    mon_texte TEXT := 'Bonjour';
    mon_tableau INTEGER[] := '{1, 2, 3}';
    ma_date DATE := CURRENT_DATE;
```

### Constantes

Utilisez `CONSTANT` pour déclarer une constante.

```sql
DECLARE
    PI CONSTANT NUMERIC := 3.14159;
```

### C. Alias de type

Vous pouvez utiliser `%TYPE` pour déclarer une variable du même type qu’une colonne de table.

```sql
DECLARE
    nom_client clients.nom%TYPE;
```

## Expressions et instructions de base

### Affectation

L’affectation se fait avec `:=` ou `SELECT INTO`.

```sql
ma_variable := 42;
SELECT COUNT(*) INTO nombre_clients FROM clients;
```

### Instructions SQL

Toute instruction SQL valide peut être utilisée dans un bloc PL/pgSQL.

```sql
INSERT INTO clients (nom, email) VALUES ('Dupont', 'dupont@example.com');
UPDATE clients SET email = 'nouvel@example.com' WHERE id = 1;
DELETE FROM clients WHERE id = 1;
```

### Appel de fonction

```sql
resultat := ma_fonction(param1, param2);
```

## Structures de contrôle

### Conditionnelles (`IF/ELSE`)

```sql
IF condition THEN
    -- instructions
ELSIF autre_condition THEN
    -- instructions
ELSE
    -- instructions
END IF;
```

**Exemple :**

```sql
IF age >= 18 THEN
    statut := 'majeur';
ELSE
    statut := 'mineur';
END IF;
```

### Boucles (`LOOP`, `WHILE`, `FOR`)

#### `LOOP` (boucle infinie avec sortie conditionnelle)

```sql
LOOP
    -- instructions
    EXIT WHEN condition;
END LOOP;
```

#### `WHILE`

```sql
WHILE condition LOOP
    -- instructions
END LOOP;
```

#### `FOR` (itération sur un ensemble de résultats)

```sql
FOR ma_variable IN SELECT * FROM clients LOOP
    -- instructions
END LOOP;
```

**Exemple :**

```sql
FOR client IN SELECT * FROM clients WHERE age > 18 LOOP
    RAISE NOTICE 'Client majeur : %', client.nom;
END LOOP;
```

## Curseurs

Les curseurs permettent de parcourir les résultats d’une requête ligne par ligne.

### Déclaration et utilisation

```sql
DECLARE
    mon_curseur CURSOR FOR SELECT * FROM clients;
    client_record clients%ROWTYPE;
BEGIN
    OPEN mon_curseur;
    LOOP
        FETCH mon_curseur INTO client_record;
        EXIT WHEN NOT FOUND;
        -- Traitement de la ligne
        RAISE NOTICE 'Client : %', client_record.nom;
    END LOOP;
    CLOSE mon_curseur;
END;
```

### Curseurs avec paramètres

```sql
DECLARE
    mon_curseur CURSOR(age_min INTEGER) FOR
        SELECT * FROM clients WHERE age > age_min;
BEGIN
    OPEN mon_curseur(18);
    -- ...
END;
```

## Gestion des erreurs et messages

### Gestion des exceptions (`EXCEPTION`)

```sql
BEGIN
    -- instructions
EXCEPTION
    WHEN division_by_zero THEN
        RAISE NOTICE 'Division par zéro !';
    WHEN OTHERS THEN
        RAISE EXCEPTION 'Erreur inattendue : %', SQLERRM;
END;
```

### Messages (`RAISE`)

* `RAISE NOTICE` : Message informatif.
* `RAISE WARNING` : Avertissement.
* `RAISE EXCEPTION` : Erreur fatale.

**Exemple :**

```sql
RAISE NOTICE 'Le client % est majeur', nom_client;
RAISE EXCEPTION 'Le client % n''existe pas', id_client;
```

## Exemple complet : Fonction PL/pgSQL

```sql
CREATE OR REPLACE FUNCTION calculer_solde_moyen()
RETURNS NUMERIC AS $$
DECLARE
    total NUMERIC;
    nombre_clients INTEGER;
    moyenne NUMERIC;
BEGIN
    SELECT SUM(solde), COUNT(*) INTO total, nombre_clients FROM comptes;
    IF nombre_clients = 0 THEN
        RAISE EXCEPTION 'Aucun client trouvé !';
    END IF;
    moyenne := total / nombre_clients;
    RETURN moyenne;
EXCEPTION
    WHEN OTHERS THEN
        RAISE EXCEPTION 'Erreur : %', SQLERRM;
END;
$$ LANGUAGE plpgsql;
```

## Bonnes pratiques

* **Commenter votre code** pour faciliter la maintenance.
* **Utiliser des transactions** pour les opérations critiques.
* **Limiter l’utilisation de `OTHERS`** dans les blocs `EXCEPTION` pour éviter de masquer des erreurs.
* **Préférer les curseurs** pour les traitements lourds sur de grands jeux de données.

## Ressources utiles

* [Documentation officielle PL/pgSQL](https://www.postgresql.org/docs/current/plpgsql.html)
* [Tutoriel PL/pgSQL en anglais](https://www.postgresqltutorial.com/plpgsql/)

## Exemples de fonctions PL/pgSQL pour traitement

* [Dates](./plpgsql-date.md) Traitement sur les dates

---

---
url: /programmation/powershell.md
description: Connexion à une base de données PostgreSQL en powershell
---

# Powershell avec PostgreSQL

## Qu’est-ce que PowerShell ?

Avant d'attaquer avec des exemples en Powershell, il convient de faire un explication rapide
sur ce qu'est PowerShell

### Introduction

**PowerShell** est un **shell de ligne de commande** et un **langage de script** développé par Microsoft, principalement utilisé pour l’automatisation des tâches,
la gestion des systèmes et l’administration des environnements Windows (mais aussi Linux et macOS depuis 2016).

Il permet aux administrateurs et aux développeurs d’automatiser des processus répétitifs, de gérer des configurations, et d’interagir avec le système d’exploitation, les applications et les services de manière efficace.

#### Version de PowerShell

| Version,Plateforme | Basé sur | Multiplateforme | Compatibilité modules Windows |
| :----------------: | :---: | :---: | :---: |
|1.0 à 5.1|Windows|.NET Framework|Non|Oui|
|Core 6.0+|Windows/Linux/mac|.NET Core|Oui|Partielle|
|7.0+|Windows/Linux/mac|.NET 5/6/7/8|Oui|Très bonne|

::: info Quelle version utiliser ?

* Pour les environnements Windows traditionnels : PowerShell 5.1 (stable et complet).
* Pour les environnements multiplateformes ou modernes : PowerShell 7.4 (ou la dernière version disponible).
  :::

#### Points clés

* **Shell interactif** : Permet d’exécuter des commandes en temps réel.
* **Langage de script** : Permet d’écrire des scripts (.ps1) pour automatiser des tâches complexes.
* **Basé sur des objets** : Contrairement aux shells traditionnels (comme cmd.exe) qui manipulent du texte, PowerShell manipule des **objets** (instances de classes .NET),
  ce qui facilite la gestion des données et l’intégration avec d’autres technologies Microsoft.
* **Extensible** : Grâce à des **modules** et des **cmdlets** (commandes spécialisées), il est possible d’étendre ses fonctionnalités.

### Briques technologiques de PowerShell

PowerShell repose sur plusieurs technologies clés:

| Brique technologique                  | Rôle                                                                                           |
|---------------------------------------|------------------------------------------------------------------------------------------------|
| **.NET Framework/.NET Core**          | PowerShell est construit sur .NET, ce qui lui permet de manipuler des objets .NET directement. |
| **Cmdlets**                           | Commandes spécialisées (ex: `Get-Process`, `Set-Service`) écrites en .NET.                     |
| **Modules**                           | Regroupent des cmdlets et des fonctions pour étendre PowerShell.                               |
| **Pipeline**                          | Permet de chaîner des commandes et de transmettre des objets entre elles.                      |
| **WS-Management (WinRM)**             | Protocole utilisé pour la gestion à distance des machines.                                     |
| **PowerShell Remoting**               | Permet d’exécuter des commandes sur des machines distantes.                                    |
| **Desired State Configuration (DSC)** | Outil de gestion de configuration basé sur PowerShell.                                         |

### En résumé

PowerShell est un outil puissant pour l’automatisation et l’administration système,
construit sur **.NET** et enrichi par des **cmdlets**,
des **modules** et des protocoles de gestion à distance.

Il est largement utilisé par les administrateurs système, les DevOps et les développeurs pour gérer des infrastructures locales ou cloud.

Et comme il est basé sur **.NET** on peut utiliser le driver ODBC ou tout autre bibliothèque qui permet de se connecter à PostgreSQL comme [Npgsql](https://www.npgsql.org/ ".NET Access to PostgreSQL")

## Accès avec le driver ODBC

Pour notre exemple de script PowerShell qui utilise le driver `ODBC` officiel pour se connecter à une base de données PostgreSQL. Ce script suppose que le driver ODBC pour PostgreSQL est déjà installé sur votre machine (par exemple, [psqlODBC](https://odbc.postgresql.org/ "Driver ODBC for Windows") en version 32 ou 64 bits).

La documentation d'installation en français se trouve dans [cette partie](../installation/odbc-windows.md "Installation driver ODBC").

### Prérequis

* PowerShell 5.1 et 7.0+
* Le driver ODBC pour PostgreSQL doit être installé (de préférence utiliser la version 64 bits).
* Une source de données ODBC (DSN) doit être configurée, ou vous pouvez utiliser une chaîne de connexion directe.

### Exemple de script PowerShell

```powershell
# Paramètres de connexion
$server = "localhost"          # ou l'adresse IP/nom du serveur PostgreSQL
$port = "5432"                 # port par défaut de PostgreSQL
$database = "nom_de_votre_base"
$username = "votre_utilisateur"
$password = "votre_mot_de_passe"

# Chaîne de connexion ODBC (sans DSN)
$connectionString = "Driver={PostgreSQL Unicode};Server=$server;Port=$port;Database=$database;Uid=$username;Pwd=$password;"

try {
    # Création de l'objet de connexion ODBC
    $connection = New-Object System.Data.Odbc.OdbcConnection($connectionString)

    # Ouverture de la connexion
    $connection.Open()

    Write-Host "Connexion à PostgreSQL réussie !" -ForegroundColor Green

    # Récupération de la version de PostgreSQL
    $query = "SELECT version();"
    $command = New-Object System.Data.Odbc.OdbcCommand($query, $connection)
    $reader = $command.ExecuteReader()

    # Affichage du résultat
    while ($reader.Read()) {
        Write-Host "Version de PostgreSQL : " $reader[0]
    }

    # Fermeture de la connexion
    $reader.Close()
    $connection.Close()
}
catch {
    Write-Host "Erreur lors de la connexion ou de l'exécution de la requête : $_" -ForegroundColor Red
}
finally {
    # Même si c'est un script, on ferme la connexion pour que les ressources cotés serveur soient récupérées
    if ($connection.State -eq 'Open') {
        $connection.Close()
    }
}
```

### Explications

* **Driver={PostgreSQL Unicode}** : Spécifie le driver ODBC à utiliser. Assurez-vous que le nom correspond exactement à celui installé sur votre système.
* **Server, Port, Database, Uid, Pwd** : Remplacez par vos informations de connexion.
* **System.Data.Odbc** : Utilise la classe .NET pour les connexions ODBC.

### Configuration du DSN (optionnel)

Si vous préférez utiliser un DSN, configurez-le via l'outil "ODBC Data Source Administrator" (version 32 ou 64 bits), puis remplacez la chaîne de connexion par :

```powershell
$connectionString = "DSN=nom_de_votre_dsn;Uid=$username;Pwd=$password;"
```

### Remarques

* Assurez-vous que le module .NET `System.Data` est disponible (il l'est par défaut sous Windows).
* Pour tester, exécutez le script dans une session PowerShell avec les droits nécessaires.

## Accès avec Npgsql

Voici un exemple complet d’utilisation de **Npgsql** avec **PowerShell** pour interagir avec une base de données PostgreSQL, incluant l’installation de la bibliothèque.

### Prérequis

* PowerShell >= 7.0+
* Driver Npgsql et toute ses dépendances.

### Installation de Npgsql

Pour utiliser Npgsql dans PowerShell, il faut d’abord installer le package NuGet. Celui-ci n'est pas disponible pour PowerShell directement,
quelques manipulations supplémentaires vont être nécessaire.

#### Méthode 1 : Creation d'un projet Dotnet

Je vous ai préparé un dépôt contenant un projet minimal, pour la génération et le test de la librairie.

::: warning

Pour pouvoir compiler le projet il faut que vous ayez installer le SDK dotnet, pour cela utiliser winget dans un terminal.

La commande ci-dessous installera la version 8.0 de dotnet

```shell
winget install --id Microsoft.DotNet.SDK.8 -e
```

:::

```shell
git clone https://github.com/5432-fr/powershell-npgsql.git
```

puis executer les commandes suivantes

```shell
dotnet restore
dotnet build
dotnet publish -c Release --sc true -o .\build
Compress-Archive -Path .\build\*.dll -DestinationPath .\PowerShell-Npgsql-9.0.4.zip
```

Tous le nécessaire est disponible dans le fichier ZIP `PowerShell-Npgsql-9.0.4.zip`

#### Méthode 2 : Téléchargement fichier ZIp

La méthode 1 nécessite quelques connaissances en programmation Dotnet,
je vous ai donc préparé un fichier ZIP disponible à cette [adresse](https://github.com/5432-fr/powershell-npgsql/releases)

### Exemple d’utilisation de Npgsql avec PowerShell

Voici un script PowerShell qui se connecte à une base PostgreSQL, exécute une requête et affiche les résultats :

```powershell
# Charger l'assembly Npgsql
Add-Type -Path "C:\Chemin\Vers\Npgsql.dll"  # Remplacez par le chemin réel

# Paramètres de connexion
$connectionString = "Host=localhost;Username=postgres;Password=votre_mot_de_passe;Database=nom_de_votre_base"

# Créer et ouvrir la connexion
$connection = New-Object Npgsql.NpgsqlConnection($connectionString)
$connection.Open()

# Créer une commande SQL
$command = $connection.CreateCommand()
$command.CommandText = "SELECT version();"

# Exécuter la commande et récupérer les résultats
$reader = $command.ExecuteReader()

# Afficher les résultats
while ($reader.Read()) {
    Write-Host "Version de PostgreSQL : " $reader[0]
}

# Fermer la connexion
$reader.Close()
if ($connection.State -eq 'Open') {
    $connection.Close()
}
```

### Exemple complet avec gestion des erreurs

```powershell
try {
    Add-Type -Path "C:\Chemin\Vers\Npgsql.dll"

    $connectionString = "Host=localhost;Username=postgres;Password=votre_mot_de_passe;Database=nom_de_votre_base"
    $connection = New-Object Npgsql.NpgsqlConnection($connectionString)
    $connection.Open()

    $command = $connection.CreateCommand()
    $command.CommandText = "SELECT version();"

    $reader = $command.ExecuteReader()

    while ($reader.Read()) {
        Write-Host "Version de PostgreSQL : " $reader[0]
    }

    $reader.Close()
    $connection.Close()
}
catch {
    Write-Error "Une erreur est survenue : $_"
}
finally {
    if ($connection.State -eq 'Open') {
        $connection.Close()
    }
}
```

### Remarques importantes

* Remplacez `Host`, `Username`, `Password` et `Database` par vos propres valeurs.
* Si vous utilisez PowerShell 7+, vous pouvez aussi installer Npgsql via `dotnet add package Npgsql` dans un projet .NET et référencer la DLL générée.

## Affichage d'une fenêtre de saisie

Si l'on souhaite afficher une fenêtre demandant de saisir un login et un mot de passe avant d'établir la connexion,
nous pouvons utiliser les Windows Forms

```powershell
# Chargement de Windows Forms 
Add-Type -AssemblyName System.Windows.Forms

# Création du formulaire
$form = New-Object System.Windows.Forms.Form
$form.Text = "Authentification"
$form.Size = New-Object System.Drawing.Size(300,200)
$form.StartPosition = "CenterScreen"

# Label et TextBox pour le login
$labelLogin = New-Object System.Windows.Forms.Label
$labelLogin.Location = New-Object System.Drawing.Point(10,20)
$labelLogin.Size = New-Object System.Drawing.Size(80,20)
$labelLogin.Text = "Login :"
$form.Controls.Add($labelLogin)

$textBoxLogin = New-Object System.Windows.Forms.TextBox
$textBoxLogin.Location = New-Object System.Drawing.Point(100,20)
$textBoxLogin.Size = New-Object System.Drawing.Size(150,20)
$form.Controls.Add($textBoxLogin)

# Label et TextBox pour le mot de passe
$labelPass = New-Object System.Windows.Forms.Label
$labelPass.Location = New-Object System.Drawing.Point(10,50)
$labelPass.Size = New-Object System.Drawing.Size(80,20)
$labelPass.Text = "Mot de passe :"
$form.Controls.Add($labelPass)

$textBoxPass = New-Object System.Windows.Forms.TextBox
$textBoxPass.Location = New-Object System.Drawing.Point(100,50)
$textBoxPass.Size = New-Object System.Drawing.Size(150,20)
$textBoxPass.PasswordChar = "*"
$form.Controls.Add($textBoxPass)

# Bouton de validation
$buttonOK = New-Object System.Windows.Forms.Button
$buttonOK.Location = New-Object System.Drawing.Point(100,90)
$buttonOK.Size = New-Object System.Drawing.Size(75,23)
$buttonOK.Text = "OK"
$buttonOK.DialogResult = [System.Windows.Forms.DialogResult]::OK
$form.AcceptButton = $buttonOK
$form.Controls.Add($buttonOK)

# Affichage du formulaire
$result = $form.ShowDialog()

# Récupération des valeurs saisies
if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
    $login = $textBoxLogin.Text
    $password = $textBoxPass.Text
    Write-Host "Login : $login"
    Write-Host "Mot de passe : $password"
}
```

**Explications :**

* Ce script crée une fenêtre avec deux champs (login et mot de passe).
* Le champ mot de passe masque les caractères saisis.
* Le bouton "OK" valide la saisie et affiche les valeurs dans la console PowerShell.

## Affichage des données

Pour afficher les données, nous avons la possibilité d'utiliser le composant `DataGridView` de `Windows.Forms`
Ci dessous le script permet de créer une fenêtre contenant un tableau modifiable, idéal pour visualiser et éditer des données.

```powershell
Add-Type -AssemblyName System.Windows.Forms

# Création du formulaire
$form = New-Object System.Windows.Forms.Form
$form.Text = "Tableau de données"
$form.Size = New-Object System.Drawing.Size(600, 400)
$form.StartPosition = "CenterScreen"

# Création du DataGridView
$dataGridView = New-Object System.Windows.Forms.DataGridView
$dataGridView.Location = New-Object System.Drawing.Point(10, 10)
$dataGridView.Size = New-Object System.Drawing.Size(560, 300)
$dataGridView.AutoSizeColumnsMode = [System.Windows.Forms.DataGridViewAutoSizeColumnsMode]::Fill
$form.Controls.Add($dataGridView)

# Exemple de données
$data = @(
    [PSCustomObject]@{ Nom = "Alice"; Âge = 30; Ville = "Paris" },
    [PSCustomObject]@{ Nom = "Bob"; Âge = 25; Ville = "Lyon" },
    [PSCustomObject]@{ Nom = "Charlie"; Âge = 35; Ville = "Marseille" }
)

# Ajout des données au DataGridView
$dataGridView.DataSource = $data

# Bouton de fermeture
$buttonClose = New-Object System.Windows.Forms.Button
$buttonClose.Location = New-Object System.Drawing.Point(250, 330)
$buttonClose.Size = New-Object System.Drawing.Size(100, 30)
$buttonClose.Text = "Fermer"
$buttonClose.DialogResult = [System.Windows.Forms.DialogResult]::Cancel
$form.CancelButton = $buttonClose
$form.Controls.Add($buttonClose)

# Affichage du formulaire
$form.ShowDialog()
```

**Explications :**

* Ce script crée une fenêtre avec un contrôle `DataGridView`.
* Les données sont définies sous forme de tableau d’objets PowerShell.
* Le tableau est automatiquement rempli et les colonnes s’adaptent à la taille de la fenêtre.
* Les données directement dans la table sont modifiables.

**Personnalisation :**

* Remplace `$data` par les données récupérés.
* Tu peux ajouter des colonnes, changer les titres, ou ajouter des boutons pour exporter les données.

## Sécurisation

Il n'est pas conseillé de stocker les identifiants en clair dans les scripts, nous pouvons soit:

* Demander les identifiants à l'utilisateur lors du lancement du script
* Récupérer les informations dans le fichier `pgpass`

### Méthode interactive

Lors de l'exécution d'un script, la fonction
[Get-Credential](https://learn.microsoft.com/fr-fr/powershell/module/microsoft.powershell.security/get-credential?view=powershell-7.5 "PowerShell Get-Credential")
permet de demander un identifiant et mot de passe à l'utilisateur.

```powershell
# Demander les identifiants à l'utilisateur
$credential = Get-Credential -Message "Veuillez entrer vos identifiants PostgreSQL"

# Paramètres de connexion
$server = "localhost"  # ou l'adresse IP/nom du serveur
$port = "5432"        # port par défaut de PostgreSQL
$database = "nom_de_ta_base"  # remplace par le nom de ta base

# Créer la chaîne de connexion
$connectionString = "Server=$server;Port=$port;Database=$database;UserId=$($credential.UserName);Password=$($credential.GetNetworkCredential().Password);"
```

### Méthode automatique

Pour la méthode automatique, il est préférable d'utiliser des solutions qui ont fait leurs preuves

PostgreSQL possèdent un fichier spécial (pgpass) qui permet de stocker les informations de connexions aux différentes serveurs bases de données

::: tip
Sous windows ce fichier est stocké dans le dossier utilisateur APPDATA sous le chemin `%APPDATA%\postgresql\pgpass.conf`

il s'agit d'un fichier dont le séparateur entre les champs est le `:` et les colonnes suivantes

* Nom hôte ou IP
* Port d'écoute
* base de données
* Nom d'utilisateur
* Mot de passe
  :::

Un exemple de fichier `pgpass.conf`

```ini [pgpass.conf]
# Première connexion
localhost:5432:postgres:demo:demo1234
```

::: warning Avertissement
Si vous lancez le script avec un autre utilisateur, il faudra que le fichier `pgpass` se trouve dans son `APPDATA`
:::

Pour l'utiliser dans vos scripts, laisser le mot de passe vide

---

---
url: /installation/pg-18-windows.md
description: Installation de la version 18 de PostgreSQL sous Windows Server et Desktop
---

# Installation PostgreSQL 18 sous Windows

## Compatibilité

Ci dessous le tableau de compatibilité des versions de PostgreSQL et Windows (Server et Desktop)

| Version PostgreSQL | Version Windows  |
|:-:|:- |
| PostgreSQL 18 |  Windows Server 2025 64 bitsWindows Server 2022 64 bitsWindows Server 2019 64 bits Windows 11 64 BitsWindows 10 64 Bits|
| PostgreSQL 17 |  Windows Server 2025 64 bitsWindows Server 2022 64 bitsWindows Server 2019 64 bits Windows 11 64 BitsWindows 10 64 Bits|
| PostgreSQL 16 |  Windows Server 2022 64 bitsWindows Server 2019 64 bitsWindows 11 64 BitsWindows 10 64 Bits|
| PostgreSQL 15 |  Windows Server 2019 64 bitsWindows Server 2016 64 bitsWindows 10 64 Bits|
| PostgreSQL 14 |  Windows Server 2019 64 bitsWindows Server 2016 64 bitsWindows 10 64 Bits|
| PostgreSQL 13 |  Windows Server 2019 64 bitsWindows Server 2016 64 bitsWindows 10 64 Bits|

::: info Cycle de vie
Le cycle de vie des versions de PostgreSQL est défini dans la partie [information](../information.md#cycle-de-vie "Cycle de vie PostgreSQL")
:::

Installation des version précédentes

* [PostgreSQL version 17 sous Windows](./pg-17-windows.md "PostgreSQL version 17 sous Windows")

## Téléchargement

Après avoir téléchargé l'installeur, vous devez avoir un fichier similaire dans votre dossier **Téléchargements**

![Fichier téléchargement windows](pg-18-windows-step_1.png)

::: warning
Les droits administrateur seront requis pour l'installation de PostgreSQL en tant que service Windows
:::

## Exécution en mode administrateur

Selectionner votre ficher de l'installeur puis faite un clic droit

![Execution en administrateur](pg-18-windows-step_2.png "Execution en administrateur")

Puis sélectionner **Exécuter en tant qu'administrateur**

![Ecran de bienvenue PG 18](pg-18-windows-step_3.png "Ecran de bienvenue PG 18")

Nous arrivons sur l'écran de bienvenue, rien à faire de particulier, cliquer sur **Suivant**

## Dossier d'installation

![Dossier d'installation](pg-18-windows-step_4.png "Dossier d'installation")

Cet écran nous propose de sélectionner le dossier d'installation, vous pouvez laisser le dossier par défaut,
ou bien le changer pour utiliser un autre lecteur (D:, E:).

L'utilisation d'un autre lecteur que le C permet :

* Séparer la partition système de la partition des données, au cas ou vous auirez besoin de restaurer la partition système,
* Si votre lecteur C est de petite taille,
* Si vos lecteurs sont sur des disques distincts, pour améliorer les performances de lecture/écriture.

Puis valider sur **Suivant**

## Sélection des composants

![Sélection des composants](pg-18-windows-step_5.png "Sélection des composants")

Ensuite nous allons sélectionner les composants a installer.

* **PostgreSQL Server**: Le serveur PostgreSQL lui même
* **PgAdmin 4**: le client graphique permettant la gestion de la base de données PostgreSQL
* **Stack Builder**: Programmes et extensions suppélmentaires pour PostgreSQL
* **Command Line Tools**: Utilitaire PostgreSQL en ligne de commande (utilitaire psql par exemple)

Décocher les composants que vous ne souhaitez pas installer, puis cliquer sur **Suivant**

## Dossier de données

![Dossier des données de PostgreSQL](pg-18-windows-step_6.png "Dossier des données de PostgreSQL")

Sélectionner un dossier ou seront conservés les données des base de données créées.

Vous pouvez laisser le dossier par défaut, ou choisir un emplacement sur une autre lecteur.

::: warning
N'utiliser pas de lecteurs réseaux pour des questions de performance et de stabilité.
:::

Valider ensuite en cliquant sur **Suivant**

## Mot de passe

![Mot de passe utilisateur postgres](pg-18-windows-step_7.png "Mot de passe utilisateur postgres")

Vous devez définir ensuite le mot de passe de l'utilisateur **postgres**, cet utilisteur est le super utilisateur de la
base de données, mais également l'utilisateur windows qui lancera des service additionnel comme pgAgent par exemple.

Choisissez un mot de passe robuste pour cette utilisateur.

## Port d'écoute

!\[Port d'écoute]\(pg-18-windows-step\_8.png Port d'écoute)

Le port par défaut de PostgreSQL est 5432, vous pouvez bien sur le changer

::: info
Sous Windows vous pouvez installer plusieurs versions de PostgreSQL, dans ce cas, il faudra un port différent
pour chacun des services
:::

Valider en cliquant sur **Suivant**

## Locale

Vous pouvez sélectionner la locale par défaut de votre cluster

![Locale French France, locale du cluster](pg-18-windows-step_9.png "Locale French France, locale du cluster")

Si votre base de données contiendra des données exclusivement en français, je vous conseille de sélectionner **French, France** (ou tout autre variante de French)

Sinon je vous invite à lire la documentation à ce sujet.

## Résumé

![Résumé de l'installation](pg-18-windows-step_10.png "Résumé de l'installation de PG 18")

Cliquer sur **Suivant** pour débuter l'installation, ou **Retour** si vous souhaitez changer certaines options.

![Démarrage de l'installation](pg-18-windows-step_11.png "Démarrage de l'installation de PG 18")

Confimer le lancement de l'installation en cliquant sur **Suivant**

![Progression de l'installation](pg-18-windows-step_12.png "Progression de l'installation")

Cet écran vous affiche la progression de l'installation.

## Fin d'installation

![Fin d'installation de PostgreSQL](pg-18-windows-step_13.png "Fin d'installation de PostgreSQL")

Ecran final d'installation.

Celui-ci vous demande si vous souhaitez lancer Stack Builder pour installer des composants additionnels.

Vous pourrez lancer le Stack Builder depuis le menu Windows ultérieurement.

## Sécurisation

Même si on est sous Windows, la sécurité à son importance. Il convient donc d'ajouter une règle entrante
pour autoriser le port 5432 (ou celui que vous avez mis) en TCP

::: warning
Le parefeu de Windows Server 2025 bloque les connexions par défaut, il faut par conséquent ouvrir le port
que vous avez définit pendant l'installation de PostgreSQL

Et comme on est pas à l'abri qu'une MAJ Windows force la fermeture des ports par défaut si aucune règle n'est définie
il vaut mieux explicitement ajouter une règle dans le pare feu.
:::

Rendez vous dans le parefeu Windows, sélectonner `Règles de traffic entrant`, puis clic droit et `Nouvelle règle`

![Selectionner le mode](./parefeu-windows-step_1.png "Parefeu - Selectionner le mode")

Selection le type de règle en sélectionnant `Port`, puis faite **suivant**

![Protocole et ports](./parefeu-windows-step_2.png "Parefeu - Protocole et ports")

Sélectionner `TCP` puis `Ports locaux spécifiques` en indiquant `5432`.

::: tip Astuces
Si vous voulez indiquer plusieurs port, car vous avez plusieurs versions de PostgreSQL,
Vous séparez les différents ports par une virgule.
:::

Puis cliquer sur **Suivant**

![Action](./parefeu-windows-step_3.png "Parefeu - Action")

Sélectionner `Autoriser la connexion`, puis faite **Suivant**

![Profil](./parefeu-windows-step_4.png "Parefeu - profil")

Selectionner les profils.

::: warning Avertissement
Si vous cocher `Public`, celui veux dire que vous autorisez l'éventuelle connexion
depuis des hotspots ou connexion grand public (Gares, Hotels, Bars, Restaurants, etc.).

Ce mode n'est pas recommandé par défaut.
:::

Puis faite **Suivant**

![Nommage règle](./parefeu-windows-step_5.png "Parefeu - Nommage règle")

Dernière étapes, on nomme explicitement la règle poru la retoruver plus facilement dans la liste

Puis faite **Terminer**

![Visualisation de la règle](./parefeu-windows-step_6.png "Parefeu - Visualisation de la règle")

Vous pouvez également ajouter cette règle via Powershell, si vous souhaitez automatiser cette étape via la commande [New-NetFirewallRule](https://learn.microsoft.com/fr-fr/powershell/module/netsecurity/new-netfirewallrule "Commande Powershell New-NetFirewallRule")

```powershell
New-NetFirewallRule -Name "PostgreSQL Server Port" -DisplayName "PostgreSQL Server Port" -Description 'Ouverture port PostgreSQL' `
    -Profile Any -Direction Inbound -Action Allow -Protocol TCP -Program Any -LocalAddress Any -LocalPort 5432
```

---

---
url: /installation/pg-17-windows.md
description: Installation de la version 17 de PostgreSQL sous Windows Server et Desktop
---

# Installation PostgreSQL 17 sous Windows

## Compatibilité

Ci dessous le tableau de compatibilité des versions de PostgreSQL et Windows (Server et Desktop)

| Version PostgreSQL | Version Windows  |
|:-:|:- |
| PostgreSQL 18 |  Windows Server 2025 64 bitsWindows Server 2022 64 bitsWindows Server 2019 64 bits Windows 11 64 BitsWindows 10 64 Bits|
| PostgreSQL 17 |  Windows Server 2025 64 bitsWindows Server 2022 64 bitsWindows Server 2019 64 bits Windows 11 64 BitsWindows 10 64 Bits|
| PostgreSQL 16 |  Windows Server 2022 64 bitsWindows Server 2019 64 bitsWindows 11 64 BitsWindows 10 64 Bits|
| PostgreSQL 15 |  Windows Server 2019 64 bitsWindows Server 2016 64 bitsWindows 10 64 Bits|
| PostgreSQL 14 |  Windows Server 2019 64 bitsWindows Server 2016 64 bitsWindows 10 64 Bits|
| PostgreSQL 13 |  Windows Server 2019 64 bitsWindows Server 2016 64 bitsWindows 10 64 Bits|

::: info Cycle de vie
Le cycle de vie des versions de PostgreSQL est défini dans la partie [information](../information.md#cycle-de-vie "Cycle de vie PostgreSQL")
:::

## Téléchargement

Après avoir téléchargé l'installeur, vous devez avoir un fichier similaire dans votre dossier **Téléchargements**

![Fichier téléchargement windows](pg-17-windows-step_1.png "Fichier téléchargement windows")

::: warning
Les droits administrateur seront requis pour l'installation de PostgreSQL en tant que service Windows
:::

## Exécution en mode administrateur

Selectionner votre installeur puis faite un clic droit

![Execution en administrateur](pg-17-windows-step_2.png "Execution en mode administrateur")

Puis sélectionner **Exécuter en tant qu'administrateur**

![Ecran de bienvenue PG 17](pg-17-windows-step_3.png "Ecran de bienvenue PG 17")

Nous arrivons sur l'écran de bienvenue, rien à faire de particulier, cliquer sur **Suivant**

## Dossier d'installation

![Dossier d'installation](pg-17-windows-step_4.png "Dossier d'installation")

Cet écran nous propose de sélectionner le dossier d'installation, vous pouvez laisser le dossier par défaut,
ou bien le changer pour utiliser un autre lecteur (D:, E:).

L'utilisation d'un autre lecteur que le C permet :

* Séparer la partition système de la partition des données, au cas ou vous auirez besoin de restaurer la partition système,
* Si votre lecteur C est de petite taille,
* Si vos lecteurs sont sur des disques distincts, pour améliorer les performances de lecture/écriture.

Puis valider sur **Suivant**

## Sélection des composants

![Sélection des composants](pg-17-windows-step_5.png "Sélection des composants")

Ensuite nous allons sélectionner les composants a installer.

* **PostgreSQL Server**: Le sevreur PostgreSQL lui même
* **PgAdmin 4**: le client graphique permettant la gestion de la base de données PostgreSQL
* **Stack Builder**: Programme et extension suppélmentaire pour PostgreSQL
* **Command Line Tools**: Utilitaire PostgreSQL en ligne de commande (utilitaire psql par exemple)

Décocher les composants que vous ne souhaitez pas installer, puis cliquer sur **Suivant**

## Dossier de données

![Dossier des données de PostgreSQL](pg-17-windows-step_6.png "Dossier des données de PostgreSQL")

Sélectionner un dossier ou seront conservés les données des base de données créées.

Vous pouvez laisser le dossier par défaut, ou choisir un emplacement sur une autre lecteur.

::: warning
N'utiliser pas de lecteurs réseaux pour des questions de performances et de stabilité.
:::

Valider ensuite en cliquant sur **Suivant**

## Mot de passe

![Mot de passe utilisateur postgres](pg-17-windows-step_7.png "Mot de passe utilisateur postgres")

Vous devez définir ensuite le mot de passe de l'utilisateur **postgres**, cet utilisteur est le super utilisateur de la
base de données, mais également l'utilisateur windows qui lancera des service additionnel comme pgAgent par exemple.

Choisissez un mot de passe robuste pour cette utilisateur.

## Port d'écoute

![Port d'écoute](pg-17-windows-step_8.png "Port d'écoute")

Le port par défaut de PostgreSQL est 5432, vous pouvez bien sur le changer

::: info
Sous Windows vous pouvez installer plusieurs versions de PostgreSQL, dans ce cas, il faudra un port différent pour chacun des services
:::

Valider en cliquant sur **Suivant**

## Locale

![Locale du cluster de base de données](pg-17-windows-step_9.png "Locale du cluster de base de données")

Vous pouvez sélectionner la locale par défaut de votre cluster

![Locale French France, locale du cluster](pg-17-windows-step_10.png "Locale French France, locale du cluster")

Si votre base de données contiendra des données exclusivement en français, je vous conseille de sélectionner **French, France** (ou tout autre variante de French)

Sinon je vous invite à lire la documentation à ce sujet.

## Résumé

![Résumé de l'installation](pg-17-windows-step_11.png "Résumé de l'installation")

Cliquer sur **Suivant** pour débuter l'installation, ou **Retour** si vous souhaitez changer certaines options.

![Démarrage de l'installation](pg-17-windows-step_12.png "Démarrage de l'installation")

Confimer le lancement de l'installation en cliquant sur **Suivant**

![Progression de l'installation](pg-17-windows-step_13.png "Progression de l'installation")

Cet écran vous affiche la progression de l'installation.

## Fin d'installation

![Fin d'installation de PostgreSQL](pg-17-windows-step_14.png "Fin d'installation de PostgreSQL")

Ecran final d'installation.

Celui-ci vous demande si vous souhaitez lancer Stack Builder pour installer des composants additionnels.

Vous pourrez lancer le Stack Builder depuis le menu Windows ultérieurement.

## Sécurisation

Même si on est sous Windows, la sécurité à son importance. Il convient donc d'ajouter une règle entrante
pour autoriser le port 5432 (ou celui que vous avez mis) en TCP

::: warning
Le parefeu de Windows Server 2025 bloque les connexions par défaut, il faut par conséquent ouvrir le port
que vous avez définit pendant l'installation de PostgreSQL

Et comme on est pas à l'abri qu'une MAJ Windows force la fermeture des ports par défaut si aucune règle n'est définie
il vaut mieux explicitement ajouter une règle dans le pare feu.
:::

Rendez vous dans le parefeu Windows, sélectonner `Règles de traffic entrant`, puis clic droit et `Nouvelle règle`

![Selectionner le mode](./parefeu-windows-step_1.png "Parefeu - Selectionner le mode")

Selection le type de règle en sélectionnant `Port`, puis faite **suivant**

![Protocole et ports](./parefeu-windows-step_2.png "Parefeu - Protocole et ports")

Sélectionner `TCP` puis `Ports locaux spécifiques` en indiquant `5432`.

::: tip Astuces
Si vous voulez indiquer plusieurs port, car vous avez plusieurs versions de PostgreSQL,
Vous séparez les différents ports par une virgule.
:::

Puis cliquer sur **Suivant**

![Action](./parefeu-windows-step_3.png "Parefeu - Action")

Sélectionner `Autoriser la connexion`, puis faite **Suivant**

![Profil](./parefeu-windows-step_4.png "Parefeu - profil")

Selectionner les profils.

::: warning Avertissement
Si vous cocher `Public`, celui veux dire que vous autorisez l'éventuelle connexion
depuis des hotspots ou connexion grand public (Gares, Hotels, Bars, Restaurants, etc.).

Ce mode n'est pas recommandé par défaut.
:::

Puis faite **Suivant**

![Nommage règle](./parefeu-windows-step_5.png "Parefeu - Nommage règle")

Dernière étapes, on nomme explicitement la règle poru la retoruver plus facilement dans la liste

Puis faite **Terminer**

![Visualisation de la règle](./parefeu-windows-step_6.png "Parefeu - Visualisation de la règle")

Vous pouvez également ajouter cette règle via Powershell, si vous souhaitez automatiser cette étape via la commande [New-NetFirewallRule](https://learn.microsoft.com/fr-fr/powershell/module/netsecurity/new-netfirewallrule "Commande Powershell New-NetFirewallRule")

```powershell
New-NetFirewallRule -Name "PostgreSQL Server Port" -DisplayName "PostgreSQL Server Port" -Description 'Ouverture port PostgreSQL' `
    -Profile Any -Direction Inbound -Action Allow -Protocol TCP -Program Any -LocalAddress Any -LocalPort 5432
```

---

---
url: /installation/odbc-windows.md
description: >-
  Installation des drivers ANSI et Unicode sous Windows en version standard ou
  minimalloc
---

# Installation driver ODBC sous Windows

## Introduction

Lors de l'installation du driver `ODBC` sous `Windows`, hormis le fait de devoir choisir entre la version 32 bits ou la version 64 bits, nous avons la possibilitée
de choisir entre la version original et la version [mimalloc](https://github.com/microsoft/mimalloc "mimalloc is a compact general purpose allocator with excellent performance")

::: tip Explications
La différence principale entre le driver ODBC original de PostgreSQL et celui utilisant l'allocateur mimalloc réside dans la gestion de la mémoire, surtout dans les environnements multi-threadés :

* Le driver original utilise l'allocateur mémoire par défaut du système (généralement malloc/free), ce qui peut entraîner des problèmes de contention de verrous (lock contention) lors d'allocation mémoire simultanée par plusieurs threads. Cela peut ralentir les applications multi-threadées, notamment sur Windows, en raison de la synchronisation nécessaire pour gérer les allocations mémoire.

* Le driver utilisant mimalloc remplace l'allocateur par défaut par mimalloc, un allocateur mémoire moderne conçu pour réduire la contention de verrous et améliorer les performances, surtout dans les applications multi-threadées. Les tests montrent que cela élimine les délais liés à la contention mémoire, sans impact sur la stabilité, et est utilisé en [production](https://postgrespro.com/list/thread-id/2689876 "performance and reduce memory allocation lock contention") depuis plusieurs mois sans problème.

En résumé, la version avec [mimalloc](https://github.com/postgresql-interfaces/psqlodbc/pull/6 "Use mimalloc to improve performance and reduce memory allocation lock contention") offre une meilleure performance et une réduction de la contention mémoire,
ce qui est particulièrement utile pour les applications multi-threadées.

L'utilisation de mimalloc est optionnelle et doit être activée lors de la compilation du driver.
:::

## Installation

La première étape consite à télécharger le driver `ODBC`.

### Téléchargement

Pour télécharger l'installeur, rendez vous sur [la page de téléchargement](https://www.postgresql.org/ftp/odbc/releases/ "Téléchargement driver Windows") du driver `ODBC` pour windows, cliquer sur la denrière version contenant **mimalloc** dans le nom de dossier, puis sélectionner la version 64 bits au format **MSI**

![Téléchargement](odbc-17-download-step_1.png "Téléchargement fichier d'installation Windows")

Lorsque le téélchargement est terminé, rendez vous dans votre dossier téléchargement

![Dossier Téléchargement](odbc-17-download-step_2.png)

Ensuite fait eun clic droit, puis executer en tant qu'administrateur (les droits administrateur sont nécessaires pour installer les pilote ODBC).

![Ecran d'accueil](odbc-17-install-step_1.png "Ecran d'accueil")

Dans cet écran cliquer seulement sur `Next`

![Licence](odbc-17-install-step_2.png)

Sur l'écran de licence, cocher la case pour l'accepter, puis cliquer sur `Next`

![Choix des composants](odbc-17-install-step_3.png)

Cet écran permet de choisir si l'on souhaite installer la documentation (en Anglais) en plus des **Drivers ODBC**, valider avec `Next`

![Récapitulatif](odbc-17-install-step_4.png)

A partir de cet écran, nosu somme prêt a installer les drivers, il faut les droits administrateur pour pouvoir continuer. cliquer sur `Install`

![Fin d'installation](odbc-17-install-step_5.png)

L'installation est terminée, cliquer sur `Finish`.

## Vérification

Pour vérifier que les drivers `ODBC` de PostgreSQL sont bien installés, rendez vous dans `Source de données ODBC 64 bits` (ou `Source de données ODBC 32 bits` si vous avez installé une version 32 bits), a partir du menu Windows, rechercher **odbc 64** puis cliquer sur ouvrir.

![Source de données ODBC](odbc_source_donnees_64-step_1.png "Source de données ODBC 64 bits")

L'outil `Administrateur de souce de données ODBC (64 bits)` s'ouvre, ensuite rendez vous dans l'onglet **Pilotes ODBC**.

![Source de données ODBC](odbc_source_donnees_64-step_2.png "Source de données ODBC 64 bits")

Dnas le tableau, vous devez voir apparaîtres les drivers ODBC AINSI et Unicode, si vous le svoyez , votre installation est terminée.

## Source de données utilisateur

Une source de données utilisateur n'est visible que par l'utilisateur connecté (session ouverte actuelle), elle ne sera donc pas visible des autres utilisateurs de la station de travail.

![Source de données utilisateur](odbc_source_donnees_util-step_1.png "Onglet source de données utilisateur")

![Selectionner un driver](odbc_source_donnees_util-step_2.png "Sélection du driver ODBC")

![Configuration](odbc_source_donnees_util-step_3.png)

1. Nom de la source de données, sera utilisé lros des appels à cette source.
2. Libellé de cette source de données
3. Nom de la base de données PostgreSQL
4. Sélectionné le mode SSL, par défaut c'est désactivé.
5. Le nom ou l'adresse IP du serveur PostgreSQL
6. Port du serveur PostgreSQL, (par défaut 5432)
7. Nom de l'utilisateur POstgreSQL
8. Mot de passe de l'utilisateur
9. Bouton pour tester la connexion
10. Sauvegarde de cette configuration

Lors de l'appuis sur le bouton test, vous devez obtenir le message suivant

![Test de connexion](odbc_source_donnees_util-step_4.png "Connexion effectué avec succès")

Notre source utilisateur apparaît dans notre liste à présent.

![Test de connexion](odbc_source_donnees_util-step_5.png "Liste des connexion utilisateurs")

## Source de données système

Une source de données système, contrairement à une source de données utilisateur, est visible par tous les utilisateurs de la station de travail.

![Source de données système](odbc_source_donnees_syst-step_1.png "Onglet source de données utilisateur")

![Selectionner un driver](odbc_source_donnees_util-step_2.png "Sélection du driver ODBC")

![Configuration](odbc_source_donnees_util-step_3.png)

1. Nom de la source de données, sera utilisé lros des appels à cette source.
2. Libellé de cette source de données
3. Nom de la base de données PostgreSQL
4. Sélectionné le mode SSL, par défaut c'est désactivé.
5. Le nom ou l'adresse IP du serveur PostgreSQL
6. Port du serveur PostgreSQL, (par défaut 5432)
7. Nom de l'utilisateur POstgreSQL
8. Mot de passe de l'utilisateur
9. Bouton pour tester la connexion
10. Sauvegarde de cette configuration

Lors de l'appuis sur le bouton test, vous devez obtenir le message suivant

![Test de connexion](odbc_source_donnees_util-step_4.png "Connexion effectué avec succès")

Notre source utilisateur apparaît dans notre liste à présent.

![Test de connexion](odbc_source_donnees_syst-step_2.png "Liste des connexion utilisateurs")

---

---
url: /logiciels/dolibarr.md
description: 'Dolibarr, logiciels utilisant PostgreSQL comme base de données'
---

# Dolibarr

## Résumé détaillé de Dolibarr

**Qu’est-ce que Dolibarr ?**

Dolibarr est un logiciel open source de gestion d’entreprise (ERP) et de relation client (CRM), conçu pour les TPE, PME, grandes entreprises, freelancers et associations. Il permet de centraliser et d’automatiser la gestion des activités professionnelles : devis, commandes, factures, stocks, agenda, contacts, projets, comptabilité, etc. Dolibarr est particulièrement apprécié pour sa flexibilité, sa simplicité d’utilisation et son approche modulaire, qui permet d’activer uniquement les fonctionnalités nécessaires à chaque entreprise.

**Origine et communauté**

Créé en 2003, Dolibarr est développé et maintenu par une large communauté internationale de bénévoles et de partenaires. Le logiciel est distribué sous licence GNU GPL v3, garantissant sa gratuité et sa liberté d’utilisation, de modification et de redistribution.

**Fonctionnalités principales**

* Gestion commerciale (devis, commandes, factures)
* Gestion des stocks et des produits
* Gestion des contacts et des relations clients (CRM)
* Gestion de projets et des tâches
* Gestion comptable et financière
* Agenda partagé et gestion des ressources humaines
* Point de vente (POS)
* Intégration avec d’autres outils via API
* Multi-utilisateurs avec différents niveaux de permissions
* Multi-devises et multi-langues

**Avantages**

* **Open Source** : Gratuit, personnalisable, indépendant des éditeurs propriétaires.
* **Modulaire** : Activation des fonctionnalités selon les besoins.
* **Web-based** : Accessible depuis n’importe quel navigateur, sans installation lourde.
* **Communauté active** : Support, documentation, modules complémentaires.
* **Intégration** : API pour connecter Dolibarr à d’autres logiciels.
* **Conformité légale** : En cours de certification pour la loi française sur les logiciels de caisse (2025).

**Inconvénients**

* Courbe d’apprentissage pour les utilisateurs non techniques.
* Certaines fonctionnalités avancées nécessitent des modules payants ou l’intervention d’un prestataire.
* Performances à surveiller en cas de bases de données très volumineuses ou de nombreux modules activés.

## Technologies utilisées par Dolibarr

### Langages et frameworks

* **PHP** : Dolibarr est développé en PHP natif, sans framework lourd, ce qui facilite la prise en main par les développeurs et la personnalisation.
* **JavaScript** : Utilisé pour les interactions côté client (AJAX, interfaces dynamiques).
* **HTML/CSS** : Pour la structure et le style des interfaces web.

### Base de données

* **MySQL** ou **PostgreSQL** : Dolibarr supporte ces deux systèmes de gestion de base de données, offrant ainsi une grande flexibilité selon l’infrastructure existante.

### Architecture

* **Application web** : Fonctionne sur un serveur web (Apache, Nginx) avec PHP.
* **Auto-installation** : Des packages sont disponibles pour Windows, Mac, Linux, Docker et Cloud, simplifiant le déploiement.

### Intégrations et API

* Dolibarr propose une API REST pour l’intégration avec d’autres logiciels (comptabilité, e-commerce, etc.).
* Possibilité de connecter des modules tiers pour étendre les fonctionnalités.

### Environnement de développement

* Développement collaboratif via GitHub.
* Documentation et wiki officiels pour les développeurs et utilisateurs.

## **Conclusion et perspectives**

Dolibarr s’impose comme une solution ERP/CRM open source mature, adaptée aux besoins variés des entreprises, avec une communauté active et une roadmap d’évolution régulière. Son approche modulaire, sa simplicité et son indépendance technologique en font un choix privilégié pour les organisations cherchant à maîtriser leurs coûts et leur infrastructure.

---

---
url: /logiciels/odoo.md
description: 'Odoo, logiciel utilisant PostgreSQL comme base de données'
---

# Odoo

## Résumé détaillé d’Odoo

### Qu’est-ce qu’Odoo ?

[Odoo](https://www.odoo.com "ERP Odoo") est une suite logicielle open source de gestion d’entreprise (ERP) et de relation client (CRM), conçue pour répondre aux besoins des entreprises de toutes tailles, des TPE aux grands groupes. Il se distingue par son approche modulaire, permettant d’activer uniquement les fonctionnalités nécessaires, et par son évolutivité, s’adaptant à la croissance et aux besoins changeants des organisations.

### Origine et modèle économique

Développé initialement en Belgique sous le nom de TinyERP puis d’OpenERP, Odoo a été renommé en 2014. Le logiciel est disponible en deux éditions :

* **Community** : Open source, gratuite, idéale pour les utilisateurs autonomes.
* **Enterprise** : Payante (à partir de ~25 €/utilisateur/mois), avec support officiel, hébergement cloud, fonctionnalités avancées et mises à jour simplifiées.

### Fonctionnalités principales

Odoo couvre un large éventail de besoins métiers grâce à ses applications intégrées :

* Gestion commerciale (CRM, ventes, facturation, e-commerce)
* Gestion des stocks et de la logistique
* Comptabilité et finance
* Gestion de projets et des tâches
* Ressources humaines (recrutement, congés, évaluations)
* Fabrication et gestion de la production
* Site web et CMS (création de sites vitrines ou e-commerce)
* Point de vente (POS)
* Marketing automation et emailing
* Gestion de la flotte automobile et des services sur le terrain
* Intégration avec des outils tiers via API.

### Avantages

* **Modularité** : Activation des modules selon les besoins, sans surcharge inutile.
* **Intégration totale** : Tous les modules communiquent entre eux, assurant une circulation fluide des données.
* **Personnalisation** : Interface intuitive, constructeur glisser-déposer, et possibilité de développement sur mesure.
* **Communauté active** : Plus de 100 000 développeurs collaborent à l’évolution du logiciel.
* **Localisation** : Adapté à plus de 70 pays, avec des règles comptables et fiscales spécifiques.
* **Innovation continue** : Mises à jour annuelles, intégration de l’IA et du machine learning pour automatiser les tâches et améliorer la prise de décision.

### Inconvénients

* La version Community nécessite des compétences techniques pour l’installation et la maintenance.
* Certains modules avancés ou spécifiques sont réservés à la version Enterprise.
* Le coût peut augmenter avec le nombre d’utilisateurs et de modules activés.

### Adoption et marché

Odoo est utilisé par plus de 8 millions d’utilisateurs dans le monde, dans des secteurs variés (industrie, services, retail, etc.). La société Odoo S.A. connaît une forte croissance, avec une valorisation atteignant 7 milliards d’euros en 2025 et une présence internationale (États-Unis, Inde, Moyen-Orient, etc.).

## Technologies utilisées par Odoo

### Langages et frameworks

* **Python** : Langage principal pour le développement du cœur d’Odoo, réputé pour sa sécurité et sa stabilité.
* **JavaScript** : Utilisé pour les interfaces utilisateur dynamiques (framework Owl, successeurs de Backbone.js).
* **XML** : Pour la définition des vues et des rapports.
* **HTML/CSS** : Pour la structure et le style des interfaces web.

### Base de données

* **PostgreSQL** : Système de gestion de base de données relationnelle open source, garantissant la pérennité et l’indépendance des données.
  PostgreSQL etant le seul moteur possible, on peut exploiter toute sa puissance et fonctionnalité native.

### Architecture

* **Application web** : Fonctionne sur un serveur web (Nginx, Apache) avec un backend Python et un frontend JavaScript.
* **Modèle MVVM** (Model-View-ViewModel) : Pour une séparation claire entre la logique métier et l’interface utilisateur.
* **API REST** : Permet l’intégration avec d’autres logiciels et services externes.

### Environnement de développement

* **Open source** : Code source disponible sur GitHub, encourageant les contributions de la communauté.
* **Odoo Studio** : Outil intégré pour personnaliser les applications sans coder.
* **Docker** : Support pour le déploiement conteneurisé.
* **Cloud et on-premise** : Hébergement possible sur les serveurs d’Odoo ou en interne.

### Innovations récentes (2025)

* Intégration poussée de l’**intelligence artificielle** et du **machine learning** pour l’automatisation des processus, l’analyse prédictive et l’aide à la décision.
* Amélioration de l’interface utilisateur et des performances.
* Renforcement de la sécurité et des fonctionnalités collaboratives.

## Conclusion et perspectives

Odoo s’impose comme l’un des ERP/CRM les plus complets et flexibles du marché, grâce à son modèle open source, sa modularité et son écosystème dynamique. Son adoption croissante et son évolution technologique constante en font un choix privilégié pour les entreprises cherchant une solution tout-en-un, évolutive et personnalisable.

---

---
url: /logiciels/erpnext.md
description: 'ErpNext, logiciel utilisant PostgreSQL comme base de données'
---

# ErpNext

## Résumé détaillé d’ERPNext

### Qu’est-ce qu’ERPNext ?

[ERPNext](https://frappe.io/erpnext) est un logiciel de gestion d’entreprise (ERP) 100% open source, conçu pour répondre aux besoins des PME, des grandes entreprises, des associations, des écoles et des organisations de divers secteurs (industrie, distribution, retail, services, santé, éducation, etc.). Il se distingue par sa gratuité, son absence de fonctionnalités cachées derrière des paywalls, et son approche modulaire et intégrée.

### Origine et communauté

Développé par la société indienne Frappe Technologies, ERPNext est distribué sous licence GPL-3.0, garantissant une totale liberté d’utilisation, de modification et de redistribution. Le projet bénéficie d’une communauté active de développeurs et d’utilisateurs, ainsi que d’un réseau de partenaires certifiés pour l’implantation, la personnalisation et le support.

### Fonctionnalités principales

ERPNext couvre l’ensemble des processus métiers grâce à ses modules intégrés :

* **Comptabilité** (grand livre, facturation, taxes, rapports financiers)
* **Ventes et CRM** (devis, commandes, pipeline commercial, gestion des contacts)
* **Achats et gestion des stocks** (bon de commande, réception, inventaire, entrepôts)
* **Fabrication** (ordonnancement, nomenclature, suivi de production)
* **Ressources humaines** (paie, recrutement, congés, évaluations)
* **Gestion de projets** (tâches, Gantt, temps passé, facturation)
* **Site web et e-commerce** (CMS, blog, boutique en ligne)
* **Point de vente (POS)**
* **Support et helpdesk**
* **Gestion des actifs**
* **Intégration avec des services tiers** (PayPal, Stripe, Shopify, Google Drive, etc.).

### Avantages

* **Open source et gratuit** : Pas de frais de licence, code source accessible.
* **Modulaire et personnalisable** : Activation des modules selon les besoins, développement de fonctionnalités spécifiques.
* **Interface moderne et intuitive** : Tableau de bord centralisé, navigation simple, formes cohérentes entre modules.
* **Multi-entreprises, multi-devises, multi-langues** : Adapté aux groupes internationaux.
* **Conformité fiscale** : Prise en charge des réglementations de nombreux pays.
* **Hébergement flexible** : Cloud (Frappe Cloud) ou on-premise.
* **Communauté et écosystème** : Documentation complète, forums, partenaires certifiés.

### Inconvénients

* Courbe d’apprentissage initiale pour les non-techniciens.
* Certaines fonctionnalités avancées ou intégrations tierces peuvent nécessiter l’intervention d’un partenaire ou développeur.
* Les rapports et tableaux peuvent parfois manquer de convivialité.
* Support limité en version gratuite (nécessite un abonnement pour un support prioritaire).

### Adoption et marché

ERPNext est utilisé par des milliers d’entreprises dans le monde, dans des secteurs variés. Il est souvent choisi pour son rapport qualité-prix, sa flexibilité et son indépendance technologique. La société Frappe Technologies continue d’investir dans son développement, avec des mises à jour régulières et une roadmap ambitieuse.

## Technologies utilisées par ERPNext

### Langages et frameworks

* **Python** : Langage principal pour le backend, via le framework **Frappe**, développé spécifiquement pour ERPNext. Frappe fournit une architecture modulaire, des outils de développement rapides et une API REST intégrée.
* **JavaScript** : Pour le frontend, avec une interface réactive et moderne.
* **HTML/CSS** : Pour la structure et le style des interfaces utilisateur.

### Base de données

* **PostgreSQL** : à partir de la version 14 (sortie en 2023) il est possible d'utiliser PostgreSQL en remplacement de MariaDB.
* **MariaDB** : Système de gestion de base de données relationnelle open source, optimisé pour les performances et la fiabilité.

### Architecture

* **Application web** : Fonctionne sur un serveur web (Nginx, Apache) avec un backend Python et un frontend JavaScript.
* **Modèle MVC** (Modèle-Vue-Contrôleur) : Pour une séparation claire entre la logique métier, l’interface et les données.
* **API REST** : Permet l’intégration avec d’autres logiciels et services externes.
* **Docker** : Support pour le déploiement conteneurisé, facilitant l’installation et la mise à jour.

### Environnement de développement

* **Open source** : Code source disponible sur GitHub, encourageant les contributions de la communauté.
* **Frappe School** : Plateforme de formation pour apprendre à développer et personnaliser ERPNext.
* **Frappe Cloud** : Solution d’hébergement managé, avec mises à jour automatiques, sauvegardes et support technique.

### Innovations récentes (2025)

* Amélioration de l’interface utilisateur et de l’expérience mobile.
* Renforcement des fonctionnalités de fabrication et de gestion de projets.
* Développement de l’écosystème de partenaires pour des solutions sectorielles sur mesure.

## Conclusion et perspectives

ERPNext s’impose comme une solution ERP open source mature, flexible et économique,
adaptée aux entreprises de toutes tailles et de tous secteurs.

Son approche modulaire, sa communauté active et son indépendance technologique en font un choix de plus en plus populaire,
notamment pour les organisations cherchant à éviter les coûts élevés des solutions propriétaires.

---

---
url: /logiciels/tryton.md
description: 'Tryton, logiciel utilisant PostgreSQL comme base de données'
---

# Tryton

## Résumé détaillé de Tryton

### Qu’est-ce que Tryton ?

[Tryton](https://www.tryton.org/ "ERP tryton") est un ERP (Enterprise Resource Planning) open source, modulaire et puissant, conçu pour les entreprises de toutes tailles et de tous secteurs (industrie, distribution, retail, services, construction, etc.). Il se distingue par son architecture trois tiers, sa flexibilité, sa sécurité et son absence de verrouillage propriétaire (no vendor lock-in).

### Origine et gouvernance

Tryton est développé et maintenu par la Tryton Foundation, une organisation à but non lucratif basée en Allemagne. Le projet est soutenu par une communauté internationale de développeurs et d’entreprises, et son code est entièrement open source (licence GPL-3.0), garantissant transparence et indépendance.

### Fonctionnalités principales

`Tryton` couvre l’ensemble des processus métiers grâce à ses modules intégrés et extensibles :

* **Gestion financière** (comptabilité, facturation, multi-devises, multi-sociétés)
* **Ventes et CRM** (devis, commandes, pipeline commercial, gestion des contacts)
* **Achats et gestion des stocks** (bon de commande, réception, inventaire, entrepôts)
* **Fabrication** (ordonnancement, nomenclature, suivi de production)
* **Gestion de projets** (tâches, Gantt, temps passé, facturation)
* **Ressources humaines** (paie, recrutement, congés, évaluations)
* **Analytique et reporting**
* **Intégration avec des services tiers** via API
* **Sécurité** : chiffrement TLS/HTTPS, contrôles d’accès, politiques de mots de passe, journaux d’audit.

### Avantages

* **Open source et gratuit** : Pas de frais de licence, code source accessible et modifiable.
* **Architecture trois tiers** : Client, serveur et base de données séparés, facilitant la maintenance et l’évolutivité.
* **Modularité** : Activation des modules selon les besoins, sans surcharge inutile.
* **Multi-plateforme** : Compatible avec Linux, Windows et macOS.
* **Interfaces utilisateur** : Version desktop (GTK+) et web (SAO).
* **Communauté active** : Documentation complète, forums, partenaires certifiés pour le support et la personnalisation.
* **Sécurité et conformité** : Respect des standards industriels, auditabilité du code.

### Inconvénients

* Courbe d’apprentissage pour les utilisateurs non techniques, notamment pour la personnalisation avancée.
* Certaines fonctionnalités ou intégrations peuvent nécessiter l’intervention d’un développeur ou d’un partenaire.

### Adoption et marché

Tryton est utilisé par des entreprises de divers secteurs et tailles, notamment en Europe et en Amérique latine.
Il est souvent choisi pour sa flexibilité, sa sécurité et son modèle économique transparent.
La fondation et la communauté organisent régulièrement des événements et des mises à jour pour faire évoluer le logiciel.

## Technologies utilisées par Tryton

### Langages et frameworks

* **Python** : Langage principal pour le développement du serveur et de la logique métier. Tryton utilise la librairie **python-sql**, développée par la communauté, pour écrire des requêtes SQL en Python, ce qui permet une compatibilité avec plusieurs systèmes de gestion de base de données.
* **GTK+** : Pour l’interface desktop.
* **JavaScript/HTML/CSS** : Pour l’interface web (SAO) et les interactions utilisateur.

### Base de données

* **PostgreSQL** : Système de gestion de base de données relationnelle open source, recommandé pour ses performances et sa fiabilité. L’architecture de Tryton permet théoriquement d’utiliser d’autres SGBD, mais PostgreSQL est le plus couramment utilisé et supporté.

### Architecture

* **Trois tiers** : Client (desktop ou web), serveur (Python), base de données (PostgreSQL). Cette séparation permet une grande flexibilité, une maintenance simplifiée et une évolutivité accrue.
* **API REST** : Pour l’intégration avec d’autres logiciels et services externes.
* **Modularité** : Chaque fonctionnalité est un module indépendant, facile à activer, désactiver ou personnaliser.

### Environnement de développement

* **Open source** : Code source disponible sur des plateformes comme GitHub, encourageant les contributions de la communauté.
* **Outils de développement** : Utilisation de technologies libres et d’outils modernes pour le développement, le test et le déploiement.
* **Documentation** : Très complète, avec des sections dédiées à l’architecture, l’API, et chaque module métier.

### Sécurité

* Chiffrement des données (TLS/HTTPS), contrôles d’accès granulaires, politiques de mots de passe, journaux d’audit.
* Transparence du code source, permettant des audits de sécurité indépendants.

## Conclusion et perspectives

Tryton est un ERP open source mature, sécurisé et modulaire, idéal pour les entreprises recherchant une solution flexible,
indépendante et évolutive.

Son architecture trois tiers, son utilisation de Python et PostgreSQL, et sa gouvernance communautaire
en font un choix robuste pour une gestion d’entreprise sans verrouillage propriétaire.

---

---
url: /logiciels/xtuple.md
description: 'xTuple, logiciel utilisant PostgreSQL comme base de données'
---

# xTuple

## Résumé détaillé de xTuple

### Qu’est-ce que xTuple ?

[xTuple](https://www.xtuple.com/solutions "ERP xTuple") est un logiciel ERP (Enterprise Resource Planning) spécialement conçu pour les entreprises de fabrication, de distribution et de gestion d’inventaire. Il se distingue par son approche open source, son coût abordable et sa capacité à répondre aux besoins des PME en croissance, ainsi que des entreprises plus grandes cherchant une solution flexible et évolutive.

### Origine et modèle économique

Fondée en 2001 et basée à Raleigh (Caroline du Nord, États-Unis), xTuple propose une solution ERP open source, avec des options de déploiement cloud ou on-premise. Le modèle économique repose sur une version open source gratuite et des versions payantes (xTuple Essentials, xTuple Standard, xTuple Manufacturing) offrant des fonctionnalités avancées, un support professionnel et des services cloud.

### Fonctionnalités principales

xTuple couvre l’ensemble des processus métiers grâce à ses modules intégrés :

* **Gestion de la production** (planification, ordonnancement, MRP, gestion des ateliers)
* **Gestion des stocks et entrepôts** (multi-entrepôts, suivi en temps réel, gestion des lots et numéros de série)
* **Comptabilité et finance** (grand livre, comptes clients/fournisseurs, rapports financiers)
* **Ventes et CRM** (devis, commandes, pipeline commercial, gestion des contacts)
* **Achats et gestion de la chaîne logistique**
* **Analytique et reporting** (tableaux de bord, rapports personnalisables, automatisation)
* **Gestion de projets**
* **Intégration avec des outils tiers** (via API)
* **Support multi-devises et multi-sites**.

### Avantages

* **Open source** : Code source accessible, personnalisable, sans frais de licence pour la version de base.
* **Modularité** : Activation des modules selon les besoins, évolutivité.
* **Flexibilité de déploiement** : Cloud ou on-premise, compatible Windows, macOS, Linux.
* **Coût total de possession réduit** : L’un des plus bas du marché pour un ERP complet.
* **Support et communauté** : Documentation, formation, support technique, communauté active.
* **Adapté aux fabricants** : Support natif pour la fabrication hybride, discrète, sur commande, etc.
* **Automatisation** : Réduction des tâches manuelles, amélioration de la productivité.

### Inconvénients

* Interface utilisateur parfois jugée peu intuitive, surtout pour les nouveaux utilisateurs.
* Courbe d’apprentissage pour la configuration et la personnalisation avancée.
* Certaines fonctionnalités avancées ou intégrations nécessitent des compétences techniques ou l’intervention d’un partenaire.

### Adoption et marché

xTuple est particulièrement populaire auprès des PME et des entreprises de taille moyenne dans les secteurs de la fabrication et de la distribution. Il est souvent choisi pour son rapport qualité-prix, sa flexibilité et sa capacité à s’adapter aux besoins spécifiques des entreprises en croissance.

## Technologies utilisées par xTuple

### Langages et frameworks

* **C++/Qt** : Pour le cœur de l’application et l’interface utilisateur native (Windows, macOS, Linux).
* **JavaScript/HTML/CSS** : Pour les interfaces web et les interactions utilisateur.
* **SQL** : Pour les requêtes et la gestion des données.

### Base de données

* **PostgreSQL** : Système de gestion de base de données relationnelle open source, réputé pour sa robustesse et sa compatibilité avec les applications ERP.

### Architecture

* **Client-serveur** : Architecture modulaire, permettant une séparation claire entre la logique métier, l’interface et la base de données.
* **API REST** : Pour l’intégration avec d’autres logiciels et services externes.
* **Cloud et on-premise** : Déploiement flexible selon les besoins de l’entreprise.

### Environnement de développement

* **Open source** : Code source disponible, encourageant les contributions de la communauté et les personnalisations.
* **Outils de développement** : Environnements de développement modernes, documentation complète, support pour les intégrations tierces.
* **Mises à jour régulières** : Améliorations continues de l’interface, des performances et des fonctionnalités.

### Innovations récentes (2025)

* Amélioration de l’interface utilisateur et de l’expérience mobile.
* Renforcement des outils d’analytique et de reporting (tableaux de bord, graphiques, automatisation).
* Optimisation des performances et de la sécurité, notamment pour le déploiement cloud.

## Conclusion et perspectives

`xTuple` s’impose comme une solution ERP open source mature, flexible et économique,
particulièrement adaptée aux entreprises de fabrication et de distribution.

Son approche modulaire, son coût réduit et sa communauté active en font un choix privilégié pour les organisations
cherchant une alternative aux ERP propriétaires, sans sacrifier la puissance ou la personnalisation.

---

---
url: /articles.md
description: Articles divers sur PostgreSQL
---

# Articles sur PostgreSQL

Cette page regroupe des séries d'articles sur PostgreSQL en français,
cela couvre les différentes thématiques comme:

* utilisation **psql**
* les journaux de transactions
* les types de données telles que JSON et JSONB
* l'utilisation des VACUUM et AUTOVACUUM
* les extensions
* [Les coûts](./cout.md "Coûts d'acquisition de PostgreSQL")
* [Généralité](./generalite.md "Généralité")
* [Types](./types.md "Les Types")
* [Les index](./indexes.md "Les index")
* [Les langages de procédures](./plangages.md "Les langages de procédures")
* [Maintenance](./maintenance.md "Maintenance")
* [Réplication](./replication.md "Réplication PostgreSQL")
* [Sauvegarde et restauration](./sauvegarde.md "Sauvegarde PostgreSQL")
* [Fonction generate\_series](./fonction-gs.md "Fonction generate_series")

---

---
url: /clients.md
description: Listes de clients graphiques et lignes de commande pour PostgreSQL
---

# Clients graphiques et ligne de commande

`PostgreSQL` possède une multitude de clients graphique ou en ligne de commande. Parmi ces clients, certains sont davantage des outils d’administration,
tandis que d’autres offrent des fonctionnalités utiles aux développeurs, certains proposent un mix des deux.

Voici une liste des principaux clients pour interagir avec PostgreSQL, classés en deux catégories : **clients graphiques** et **clients en ligne de commande**.

## Clients Graphiques (GUI)

| Nom | Description | Plateformes supportées |
|:---:|:------------|:----------------------:|
| [pgAdmin 4](https://www.pgadmin.org) | L’outil officiel, riche en fonctionnalités, idéal pour l’administration. | Windows, macOS, Linux, Web |
| [DBeaver](https://dbeaver.io) | Client universel supportant PostgreSQL et bien d’autres bases de données. | Windows, macOS, Linux  |
| [TablePlus](https://tableplus.com/)  | Interface moderne, légère et intuitive. | Windows, macOS, Linux |
| [DataGrip](https://www.jetbrains.com/fr-fr/datagrip/) | IDE puissant de JetBrains pour les bases de données. | Windows, macOS, Linux  |
| **OmniDB**                | Client open source, orienté développement et administration. | Windows, macOS, Linux |
| [SQLPro for PostgreSQL](https://macpostgresclient.com/) | Client natif pour macOS, simple et efficace. | macOS |
| [pgweb](https://sosedoff.github.io/pgweb/) | Client web mais compilé poru les différentes plateformes | Windows, macOS, Linux, Web     |
| [Adminer](https://www.adminer.org) | Gestionnaire de base de données pour administation à distance | Web |
| [Navicat for PostgreSQL](https://www.navicat.com/en/products/navicat-for-postgresql) | Outil de gestion de base de données facile à utiliser conçu pour simplifier les complexités de la gestion des serveurs PostgreSQL |  Windows macOS Linux iOS |
| [PostgreSQL Maestro](https://www.sqlmaestro.com/products/postgresql/maestro/) | PostgreSQL Tools Family contient des outils d'interface graphique pour l'administration et le développement du serveur PostgreSQL | Windows |

## Clients en Ligne de Commande (CLI)

| Nom  | Description                                                                 | Plateformes supportées         |
|:----:|-----------------------------------------------------------------------------|--------------------------------|
| [psql](https://docs.postgresql.fr/17/app-psql.html) | Client officiel de PostgreSQL, puissant et scriptable. | Windows, macOS, Linux  |
| [pgcli](https://www.pgcli.com/) | Alternative à psql avec autocomplétion et syntaxe colorée. | Windows, macOS, Linux  |
| [usql](https://github.com/xo/usql) | universal command-line interface for PostgreSQL and other databases | Windows, macOS, Linux |

::: info Remarque

* **psql** est installé par défaut avec PostgreSQL.
* Pour les outils tiers, vérifie toujours la compatibilité avec ta version de PostgreSQL.
  :::

## Outil de modélisation

| Nom  | Description | Plateformes supportées |
|:----:|-------------|:----------------------:|
| [pgModeler](http://www.pgmodeler.com.br/) | pgModeler est un modeleur de base de données open source et multiplateforme conçu spécifiquement pour PostgreSQL | Linux, macOS, Windows |
| [DbVisualizer](https://www.dbvis.com/database/postgresql/features/) | DbVisualizer a été conçu pour vous offrir un contrôle maximal sur votre base de données PostgreSQL | Linux, macOS, Windows |

## Monitoring

| Nom  | Description | Plateformes supportées |
|:----:|-------------|:----------------------:|
| [temBoard](https://github.com/dalibo/temboard) | PostgreSQL Remote Control | |
| [pgwatch](https://github.com/cybertec-postgresql/pgwatch/) | Monitoring / tableau de bord pour PostgreSQL | |

## Agent

| Nom  | Description | Plateformes supportées |
|:----:|-------------|:----------------------:|
| [pg\_listen](https://github.com/begriffs/pg_listen) | Utilise Listen/Notify pour executer des commandes shell | Linux, macOS, Windows |
| [pgAgent](https://www.pgadmin.org/docs/pgadmin4/development/pgagent.html) | Planificateur de tâche sous PostgreSQL | Linux, macOS, Windows |

---

---
url: /commun.md
---

to be deleted

---

---
url: /cookbook.md
description: Liste de recette PostgreSQL
---

# Cookbook

Cette partie regroupe des recettes

* [Modelisation](./modelisation.md "Modelisation")
* [psql](./psql.md "Teminal en ligne de commande psql")

---

---
url: /cookbook/modelisation.md
description: Livre de recettes sur la modélisation sous POstgreSQL
---

# Modélisation

Lors de la modélisation

## Clé primaire int ou bigint

Lors de la création d'un table, il est préférable d'utiliser un entier en tant que clé primaire.

::: info
Vous pouvez utiliser d'autres types comme UUID par exemple, et en particulier UUIDv7 qui est apparu dans PostgreSQL 18.
:::

PostgreSQL possède 3 types d'entier :

* `smallint`: 2 octets soit de **-32 768** to **+32 767**
* `integer`: 4 octets soit **-2 147 483 648** to **+2 147 483 647**
* `bigint`: 8 octets soit **-9 223 372 036 854 775 808** to **+9 223 372 036 854 775 807**

::: tip Remarques
les types `smallint`, `integer`, `bigint` sous PostgreSQL n'existe qu'en version signé.

il n'est donc pas possible d'utiliser une version non signé pour doubler la valeur à stocker.
:::

## Longueur champ Email

Lorsque l'on veut stocker le champ email (courriel pour les français), on se pose toujours la question de la longueur maximale du champ.

La réponse se trouve dans la [RFC 3696 Section 3](https://datatracker.ietf.org/doc/html/rfc3696#section-3 "RFC3996 Section 3")

> That limit is a maximum of 64 characters (octets) in the "local part" (before the "@")
> and a maximum of 255 characters (octets) in the domain part (after the "@")
> for a total length of 320 characters.

Donc un champ email est composé comme suit:

* partie local (avant le @) est composée de 64 caractères au maximum
* le caractère @ qui compte pour 1 caractère
* partie domaine (après le @) est composée de 255 caractères au maximum

Ce qui nous donne une longueur de 64 + 1 + 255 soit 320 caractères.

Ci-dessous un exemple d'utilisation lors de la création d'une table.

```sql
CREATE TABLE utilisateurs (
    id SERIAL PRIMARY KEY,
    nom VARCHAR,
    email VARCHAR(320) UNIQUE,
    passwd VARCHAR
);
```

::: tip Remarques
Lors de la création de la table sur l'exemple ci-dessus, j'ai par exemple utilisé pour les champs `nom` et `passwd`
un `VARCHAR` sans indiqué de longueur, si vous souhaitez en savoir plus sur le pourquoi du comment,
je vous invite a lire la partie [Don't do this](https://wiki.postgresql.org/wiki/Don%27t_Do_This#Don't_use_varchar\(n\)_by_default "Wiki PostgreSQL don't do this")
du wiki de PostgreSQL.
:::

---

---
url: /cookbook/psql.md
description: Livre de recette sur l'utilisation de psql le client PostgreSQL
---

# psql

Petit rappel de ce qu'est psql

::: info
psql est une interface en mode texte pour PostgreSQL. Il vous permet de saisir des requêtes de façon interactive,
de les exécuter sur PostgreSQL et de voir les résultats de ces requêtes.

Alternativement, les entrées peuvent être lues à partir d'un fichier ou à partir des arguments de la ligne de commande.

De plus, il fournit un certain nombre de métacommandes et plusieurs fonctionnalités style shell pour faciliter l'écriture des scripts
et automatiser une grande variété de tâches.
:::

## Pagination

Que vous utilisiez `psql` quotidiennement, ou seulement quand c'est votre dernier espoir de pouvoir vous connecter à votre base de données,
il peut être utile de définir un `pager` surtout si votre requête retourne beaucoup de colonnes.

Vous pouvez utiliser `more` ou `less`, mais le rendu des colonnes est illisible, pour cela un nouvel outil a été développé.

Le développeur [Pavel Stehule](https://github.com/okbob "Pavel Stehule Github profile") nous as écrit [pspg](https://github.com/okbob/pspg "PostgreSQL Pager")
pour résoudre cette problématique.

### Installation

`pspg` est deja packagé pour les distributions les plus utilisés, vous pouvez utiliser vos gestionnaires de paquet pour procéder à l'installation

```shell
# Debian (Ubuntu)
sudo apt-get install pspg

# RedHat (Fedora)
sudo dnf install pspg
```

Ensuite avant de lancer `psql` il suffira d'indiquer quel pager vous souhaitez utiliser

```shell
export PSQL_PAGER='pspg'
```

ou dans votre fichier `~/psqlrc`

```text
\setenv PAGER pspg
\pset border 2
\pset format aligned
```

Ensuite lancer `psql` et écriver une requêtes SQL que vous aller executer.

### Navigation de base

| Commande | Description |
|:-:| - |
| **Flèches haut/bas** | Déplacer le curseur ligne par ligne |
| **Page Up / Page Down** | Déplacer d’une page à la fois |
| **Home / End** | Aller au début/à la fin du résultat |
| **g** | Aller à la première ligne |
| **G** | Aller à la dernière ligne |

### Recherche et filtrage

| Commande | Description |
|:-:| - |
| **/** | Rechercher vers l’avant |
| **?** | Rechercher vers l’arrière |
| **n** | Aller à l’occurrence suivante |
| **N** | Aller à l’occurrence précédente |
| \**\** | Filtrer les lignes (ex: `\d+` pour afficher seulement les lignes contenant "d") |

### Affichage et formatage

| Commande | Description |
|:-:| - |
| **w** | Basculer l’affichage en mode large (sans retour à la ligne) |
| **e** | Exporter les résultats vers un fichier |
| **s** | Changer l’ordre de tri des colonnes |
| **o** | Changer l’ordre des colonnes |
| **c** | Changer la couleur du thème |

### Autres commandes utiles

| Commande | Description |
|:-:| - |
| **q** | Quitter pspg |
| **h** | Afficher l’aide |
| **!** | Exécuter une commande shell |
| **Ctrl+L** | Rafraîchir l’écran |

---

---
url: /programmation/plpgsql/date.md
---

[Rubrique déplacée](../plpgsql-date.md)

---

---
url: /extensions.md
description: Diverses exetnsions pour PostgreSQL
---

# Extensions

## Apache AGE

Apache AGE® est une extension PostgreSQL qui fournit des fonctionnalités
de base de données graphiques.

L'objectif d'Apache AGE® est de fournir des capacités de traitement et
d'analyse de données graphiques à toutes les bases de données relationnelles.

Grâce à Apache AGE, les utilisateurs de PostgreSQL auront accès à la
modélisation de requêtes graphiques au sein de la base de données
relationnelle existante.

Les utilisateurs peuvent lire et écrire des données graphiques dans les
nœuds et les arêtes. Ils peuvent également utiliser divers algorithmes
tels que la longueur variable et la traversée des bords lors de l'analyse des données.

Lien vers [Apache AGE](https://age.apache.org/)

## Citus

Citus est une extension PostgreSQL qui transforme Postgres en une base
de données distribuée afin que vous puissiez atteindre des performances
élevées à n'importe quelle échelle.

Avec Citus, vous étendez votre base de données PostgreSQL avec de
nouveaux super pouvoirs :

* **Les tables distribuées** sont réparties sur un cluster de nœuds
  PostgreSQL pour combiner leur capacité CPU, mémoire, stockage et E/S.
* **Les tables de références** sont répliquées sur tous les nœuds pour
  les jointures et les clés étrangères des tables distribuées et des
  performances de lecture maximales.
* **Le moteur de requête** distribué achemine et parallélise SELECT, DML
  et d'autres opérations sur les tables distribuées à travers le
  cluster.
* **Le stockage en colonnes** compresse les données, accélère les
  analyses et prend en charge des projections rapides, à la fois sur des
  tables régulières et distribuées.
* **Les requêtes** à partir de n'importe quel nœud vous permettent
  d'utiliser toute la capacité de votre cluster pour les requêtes
  distribuées

Lien vers [Citus](https://github.com/citusdata/citus)

## PLpgSQL Checker

::: index
PLpgSQL Checker, PLpgSQL
:::

Cette extension est un linter complet pour plpgsql pour PostgreSQL.

Il exploite uniquement l'analyseur/évaluateur interne de PostgreSQL
afin que vous voyiez exactement les erreurs qui se produiraient au
moment de l'exécution. De plus, il analyse le SQL à l'intérieur de vos
routines et trouve des erreurs que l'on ne trouve généralement pas lors
de la commande **CREATE PROCEDURE/FUNCTION**.

Vous pouvez contrôler les niveaux de nombreux avertissements et astuces.

Enfin, vous pouvez ajouter des marqueurs de type PRAGAMA pour
activer/désactiver de nombreux aspects vous permettant de masquer les
messages que vous connaissez déjà, ou pour vous rappeler de revenir pour
un nettoyage plus approfondi plus tard.

Lien vers [PLpgSQL Checker](https://github.com/okbob/plpgsql_check/)

## Orafce

Ce module contient quelques fonctions utiles qui peuvent aider au
portage de l'application Oracle vers PostgreSQL ou qui peuvent être
généralement utiles.

Les fonctions de date Oracle intégrées ont été testées par rapport à
Oracle 10 pour vérifier leur conformité.

Les plages de dates de 1960 à 2070 fonctionnent correctement. Les dates
antérieures au 01/03/1100 ne peuvent pas être vérifiées en raison d'un
bug dans Oracle.

Toutes les fonctions sont entièrement compatibles avec Oracle et
respectent toutes les chaînes de format connues.

Des descriptions détaillées peuvent être trouvées sur Internet. Utilisez
des mots-clés tels que: oracle round trunc date iyyy.

Lien vers [Orafce](https://github.com/orafce/orafce)

## PostgreSQL semantic versioning extension

**pg\_text\_semver** est une extension Postgres qui implémente la
spécification Semantic Versioning 2.0.0, ce qui distingue cette
extension, c'est qu'elle offre un simple DOMAIN semver basé sur le
type de texte intégré de Postgres.

Lien vers [pg\_text\_semver](https://github.com/bigsmoke/pg_text_semver)

## pgTAP

pgTAP est un framework de tests unitaires pour PostgreSQL écrit en PL/pgSQL et PL/SQL.
il repose sur le protocole [TAP](https://testanything.org/)

Il comprend une collection complète de fonctions d'assertion émettant
des TAP, ainsi que la possibilité de s'intégrer à d'autres frameworks
de tests émettant des TAP.

Il peut également être utilisé dans le style de test xUnit

Lien vers [pgTAP](https://pgtap.org/)

---

---
url: /services/hebergeurs.md
description: Liste d'hébergeur proposant la solution PostgreSQL
---

# Hebergeurs PostgreSQL {#hosting}

Liste des sociétés offrant des hébergements pour PostgreSQL, pour des
sites web ou des applicatifs metiers

## OVH

[OVH](https://www.ovhcloud.com/fr/public-cloud/postgresql/) propose
PostgreSQL à son catalogue.

Accélérez votre activité en déployant un cluster managé PostgreSQL en
quelques clics. Bénéficiez d'un moteur de bases de données
relationnelles open-source capable de gérer de lourdes charges de
travail. Concentrez-vous ainsi sur le développement de vos
fonctionnalités applicatives, nous nous chargeons de la gestion du
service : configuration, maintenance, backup, haute disponibilité et
mises à jour.

## IONOS

[IONOS (ex 1&1)](https://cloud.ionos.fr/managed/dbaas/postgresql) vous
propose des bases de données puissantes et évolutives

Créez facilement vos propres bases de données PostgreSQL personnalisées
et confiez-nous la gestion des bases de données pour vos applications et
charges de travail complexes.

## Clever Cloud

[Clever Cloud](https://www.clever-cloud.com/postgresql-hosting) vous
propose un service PostgreSQL entièrement managé avec des outils de
supervision, de sauvegarde et de migration.

## Scalingo

[Scalingo](https://scalingo.com/fr/databases/postgresql) vous propose un
hébergement PostgreSQL managée

Provisionnez une base PostgreSQL en moins de temps qu'il n'en faut
pour chercher un café. Complètement administré, hautement disponible &
prêt pour la production.

## Kinsta

[Kinsta](https://kinsta.com/fr/hebergement-bases-de-donnees/postgresql/)
vosu propose un hébergement PostgreSQL facile et puissant

Rejoignez plus de 55.000 développeurs et entrepreneurs sur le PaaS de
Kinsta. Notre hébergement PostgreSQL vous permet de vous concentrer sur
d'autres tâches.

## Gandi

[Gandi](https://docs.gandi.net/fr/hebergement_web/gestion_base_donnees/postgresql.html)

## Ikoula

[Ikoula](https://www.ikoula.com/fr/cloud-public/oneclick/postgresql)

## Bearstech

[Bearstech](https://bearstech.com/technologies-expertises/postgresql/)
vous propose son expertise autour de PostgreSQL

---

---
url: /installation.md
description: installation des PostgreSQL et de ses divers composants sous Windows
---

# installation PostgreSQL

* [Installation PostgreSQL 18 sous Windows](./pg-18-windows.md "Installation PostgreSQL 18 sous Windows")
* [Installation PostgreSQL 17 sous Windows](./pg-17-windows.md "Installation PostgreSQL 17 sous Windows")
* [Installation Driver ODBC sous Windows](./odbc-windows.md "Installation Driver ODBC sous Windows")

---

---
url: /tdm-policy.md
description: Licence d'utilisation du contenu de 5432.fr
---

**Résumé de la Licence des Contenus du Site [5432.fr](https://5432.fr)**

Les informations, données et contenus publiés sur le site **5432.fr** sont mis à disposition sous la licence **[Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)](https://creativecommons.org/licenses/by-sa/4.0/)**.

**Ce que cela signifie :**

* **Attribution** : Vous êtes libre de partager et d’adapter les contenus, à condition de créditer **5432.fr** comme source originale.
* **Partage à l’identique** : Si vous modifiez ou transformez ces contenus, vous devez redistribuer vos contributions sous la même licence **CC BY-SA 4.0**.
* **Pas de restrictions supplémentaires** : Aucune mesure légale ou technique ne doit limiter les droits accordés par cette licence.

Pour plus de détails, consultez le texte intégral de la licence [ici](https://creativecommons.org/licenses/by-sa/4.0/).

---

---
url: /logiciel.md
---

[Rubrique déplacée](../logiciels/index.md)

---

---
url: /logiciels.md
description: Liste de logiciels utilisant PostgreSQL comme base de données
---

# Liste de logiciels fonctionnant sous PostgreSQL

## ERP

* [Dolibarr](./dolibarr.md)
* [Odoo](./odoo.md)
* [ErpNext](./erpnext.md)
* [Tryton](./tryton.md)
* [xTuple](./xtuple.md)

---

---
url: /migrations.md
description: Liste d'outils pour migrer vers PostgreSQL
---

# Les migrations vers PostgreSQL

## Migration Oracle

* la référence de la migration Oracle vers PostgreSQL [Ora2Pg](./oracle).
* Le petit dernier avec un approche compatbe Oracle [IvorySQL](/articles/ivorysql)

---

---
url: /outils.md
description: Liste d'outils pour gérer des bases de données sous PostgreSQL
---

# Outils

## Gestionnaires de base de données

| Programme | Descriptif | OS |
| --------- | ---------- | -- |
| [OmniDB](https://github.com/OmniDB/OmniDB) | Application Client et Version serveur  (Python 3.5 et Django) |![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |
| [pgAdmin 4](http://pgadmin.org) |  | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) ||
| [pgAdmin III](http://pgadmin.org) |  (Replacer par PgAdmin 4) | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |
| [phppgadmin](https://github.com/phppgadmin/phppgadmin) | Interface Web | |
| [RazorSQL](http://www.razorsql.com/features/postgresql_features.html) | Client JAVA Multibase | |
| [DataGrip](https://www.jetbrains.com/datagrip/) | | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |
| [DBeaver](https://dbeaver.io/) | | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |
| [PostgreSQL Maestro](https://www.sqlmaestro.com/products/postgresql/maestro/) | | ![Windows](windows.png) |
| [Database .NET](https://fishcodelib.com/Database.htm) | | ![Windows](windows.png) |
| [dbForge Studio](https://www.devart.com/dbforge/postgresql/studio/) | | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |
| [Navicat for PostgreSQL](https://www.navicat.com/en/products/navicat-for-postgresql) | | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |
| [Slashbase](https://slashbase.com/) | | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |
| [Valentina Studio](https://www.valentina-db.com/en/studio-for-postgresql) | | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |

## Modelisation

| Programme | Descriptif | OS |
| --------- | ---------- | -- |
| [pgModeler](http://www.pgmodeler.com.br/) | | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |
| [DbVisualizer](https://www.dbvis.com/database/postgresql/features/) | | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |

## Monitoring

| Programme | Descriptif | OS |
| --------- | ---------- | -- |
| [temBoard](https://github.com/dalibo/temboard) | PostgreSQL Remote Control | |

## Agent

| Programme | Descriptif | OS |
| --------- | ---------- | -- |
| [pg\_listen](https://github.com/begriffs/pg_listen) | Utilise Listen/Notify pour executer des commandes shell | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |
| [pgAgent](https://www.pgadmin.org/docs/pgadmin4/development/pgagent.html) | Planificateur de tâche sous PostgreSQL | ![Linux](linux.png) ![Mac OS X](macosx.png) ![Windows](windows.png) |

---

---
url: /programmation/plpgsql-date.md
description: Traitement sur les dates en PL/pgSQL
---

# Traitement sur les dates {#plpgsql\_date\_converter}

## Convertir une date Access en type date

Sous Access et historiquement Lotus 1-2-3 (Explication
[ici](https://stackoverflow.com/a/3963650)) la date est stockée sous
forme d'un entier, Dans PostgreSQL nous allons utiliser le type
interval pour retrouver le type date.

```sql
--
-- Fonction qui converti un entier en date
-- Dans Lotus 1-2-3 et Access, le jour 0 est égal au 30/12/1899
-- Auteur: Christophe CHAUVET
-- License: Creative commons BY-SA
--   https://creativecommons.org/licenses/by-sa/4.0/
--
CREATE OR REPLACE FUNCTION access_to_date(
   a_num INTEGER)
RETURNS date AS
$BODY$

BEGIN

  RETURN ('1899-12-30'::date + (a_num||' day')::interval)::date;

END;

$BODY$
LANGUAGE plpgsql;

```

Pour l'utiliser

```sql
SELECT access_to_date(42821)
-- on obtient 27/03/2017
```

## Convertir un type date en date Access

La fonction inverse, qui permet de retrouver la valeur à stocker

```sql
--
-- Fonction qui converti une date en entier
-- Dans Lotus 1-2-3 et Access, le jour 0 est égal au 30/12/1899
-- Auteur: Christophe CHAUVET
-- License: Creative commons BY-SA
--   https://creativecommons.org/licenses/by-sa/4.0/
--
CREATE OR REPLACE FUNCTION date_to_access(
   a_date DATE)
RETURNS integer AS
$BODY$

BEGIN

  RETURN (a_date - '1899-12-30'::date)::integer;

END;

$BODY$
LANGUAGE plpgsql;
```

```sql
SELECT date_to_access('2017-03-27'::date)
-- on obtient 42821
```

---

---
url: /information.md
description: >-
  Informations sur la politique de versionnement, les mises à jours et du cycle
  de vie
---

# Informations

## Politique de versionnement

Le groupe de développement mondial de **PostgreSQL** publie une nouvelle
version majeure contenant de nouvelles fonctionnalités environ une fois
par an. Chaque version majeure reçoit des correctifs de bogues et, si
nécessaire, des correctifs de sécurité qui sont publiés au moins une
fois tous les trois mois dans ce que nous appelons une « version mineure
».

Pour plus d'informations sur le calendrier des versions mineures, vous
pouvez consulter la feuille de route des versions mineures.

Si l'équipe de publication détermine qu'un bogue critique ou un
correctif de sécurité est trop important pour attendre la sortie de la
version mineure régulièrement programmée, elle peut proposer une version
en dehors de la feuille de route des versions mineures.

Le groupe de développement mondial de PostgreSQL prend en charge une
version majeure pendant 5 ans après sa sortie initiale. Après cela, une
version mineure finale sera publiée et le logiciel ne sera plus pris en
charge (fin de vie).

## Numérotation

À partir de PostgreSQL 10, une version majeure est indiquée en
augmentant la première partie du numéro de version, par exemple de 10 à
11\. Avant PostgreSQL 10, une version majeure était indiquée en
augmentant soit la première soit la deuxième partie du numéro de
version, par exemple de 9.5 à 9.6.

Les versions mineures sont numérotées en augmentant la dernière partie
du numéro de version. À partir de PostgreSQL 10, il s'agit de la
deuxième partie du numéro de version, par exemple de 10.0 à 10.1 ; pour
les versions plus anciennes, il s'agit de la troisième partie du numéro
de version, par exemple de 9.5.3 à 9.5.4.

## Mise à jour

Les versions majeures apportent des modifications complexes, de sorte
que le contenu du répertoire de données ne peut pas être conservé de
manière rétrocompatible. Un vidage/rechargement de la base de données ou
l'utilisation de l'application pg\_upgrade est nécessaire pour les
mises à niveau majeures.

Nous vous recommandons également de lire la section de mise à niveau de
la version majeure vers laquelle vous envisagez de migrer. Vous pouvez
effectuer une mise à niveau d'une version majeure vers une autre sans
effectuer de mise à niveau vers les versions intermédiaires, mais nous
vous recommandons de lire les notes de publication de toutes les
versions majeures intermédiaires avant de le faire.

Les mises à niveau de versions mineures ne nécessitent pas de vidage et
de restauration, vous arrêtez simplement le serveur de base de données,
installez les binaires mis à jour et redémarrez le serveur. De telles
mises à niveau peuvent nécessiter des étapes supplémentaires, lisez donc
toujours les notes de publication en avant toute mise à jour.

Les versions mineures ne contiennent que des correctifs pour les bogues
fréquemment rencontrés, les correctifs à faible risque, les problèmes de
sécurité et les problèmes de corruption de données.

La communauté considère que l'exécution de mises à niveau mineures est
moins risquée que de continuer à exécuter une ancienne version mineure.

::: warning Avertissement
Nous recommandons aux utilisateurs de toujours exécuter la version
mineure actuelle associée à leur version majeure.
:::

## Cycle de vie

|  Version  | Supportée | Date apparition | Fin de vie |
| :-------: | :-------: | :-------------: | :--------: |
| PostgreSQL 18  | Oui | 09/2025 | 11/2030 |
| PostgreSQL 17  | Oui | 09/2024 | 11/2029 |
| PostgreSQL 16  | Oui | 09/2023 | 11/2028 |
| PostgreSQL 15  | Oui | 10/2022 | 11/2027 |
| PostgreSQL 14  | Oui | 09/2021 | 11/2026 |
| PostgreSQL 13  | Non | 09/2020 | 11/2025 |
| PostgreSQL 12  | Non | 10/2019 | 11/2024 |
| PostgreSQL 11  | Non | 10/2017 | 11/2023 |
| PostgreSQL 10  | Non | 10/2017 | 11/2022 |
| PostgreSQL 9.6 | Non | 09/2016 | 11/2021 |
| PostgreSQL 9.5 | Non | 01/2016 | 02/2021 |
| PostgreSQL 9.4 | Non | 12/2014 | 02/2020 |
| PostgreSQL 9.3 | Non | 09/2013 | 11/2018 |
| PostgreSQL 9.2 | Non | 09/2012 | 09/2017 |
| PostgreSQL 9.1 | Non | 09/2011 | 09/2016 |
| PostgreSQL 9.0 | Non | 09/2010 | 09/2015 |
| PostgreSQL 8.4 | Non | 07/2009 | 07/2014 |
| PostgreSQL 8.3 | Non | 02/2008 | 02/2013 |
| PostgreSQL 8.2 | Non | 12/2006 | 12/2011 |
| PostgreSQL 8.1 | Non | 11/2005 | 11/2010 |
| PostgreSQL 8.0 | Non | 01/2005 | 10/2010 |
| PostgreSQL 7.4 | Non | 11/2003 | 10/2010 |
| PostgreSQL 7.3 | Non | 11/2002 | 11/2007 |
| PostgreSQL 7.2 | Non | 02/2002 | 02/2007 |
| PostgreSQL 7.1 | Non | 04/2001 | 04/2006 |
| PostgreSQL 7.0 | Non | 05/2000 | 05/2005 |
| PostgreSQL 6.5 | Non | 06/1999 | 06/2004 |
| PostgreSQL 6.4 | Non | 10/1998 | 10/2003 |
| PostgreSQL 6.3 | Non | 03/1998 | 03/2003 |

---

---
url: /programmation.md
description: Article sur la programmation
---

# Programmation

## Ecosystème

L'ecosystème PostgreSQL dispose de nombreuses bibliothèques natives
pour s'interfacer avec une multitude de langage.

Lorsque que pour un langage, aucune interface native n'est disponible,
il est parfois possible de s'y connecter avec un driver ODBC.

* [Language C](./c.md)
* [C# DotNet](./csharp.md)
* [Java](./java.md)
* [Python](./python.md)
* [PHP](./php.md)
* [PLPgSQL](./plpgsql.md)
* [PowerShell](./powershell.md)
* [Rust](./rust.md)

---

---
url: /livres.md
description: Liste de livres français traitant du serveur de base de données PostgreSQL
---

# Livres

Sélection de livres en français s'articulant autour de PostgreSQL

## PostgreSQL - Architecture et notions avancées

5 ème édition de ce livre écrit par:

* Guillaume Lelarge
* Julien Rouhaud

Lien vers [PostgreSQL - Architecture et notions avancées
(5e édition)](https://www.d-booker.fr/bases-de-donnees/805-postgresql-architecture-et-notions-avancees-5ed.html)

* EAN: 9782822711241
* ISBN: 978-2-8227-1124-1

### Présentation

![image](/postgresql-architecture-et-notions-avancees-5ed.png "PostgreSQL - Architecture et notions avancées"){.align-right}

Pour maîtriser PostgreSQL, rien de mieux que de comprendre son
fonctionnement interne. C'est ce que vous proposent **Guillaume
Lelarge**, consultant chez Dalibo, contributeur majeur de PostgreSQL,
ainsi que **Julien Rouhaud**, auteur notamment
d'[HypoPg](https://hypopg.readthedocs.io), avec ce livre sans
équivalent, pas même en anglais.

Dans un style clair et précis, il vous explique en détails la mécanique
de ce puissant système de gestion de bases de données open-source, vous
aidant ainsi à en comprendre toutes les subtilités et donc à mieux
l'administrer, le paramétrer, le superviser... en un mot à mieux
l'utiliser.

Sa lecture ne requiert pas de connaissances avancées en PostgreSQL, ni
la maîtrise préalable d'un autre moteur de bases de données. En
revanche, il est préférable que vous soyez à l'aise avec le
fonctionnement d'un système d'exploitation comme Linux. Une
connaissance modérée du langage SQL sera un plus.

Cette cinquième édition, entièrement revue et complétée, prend en compte
les nouveautés des versions 15 et 16 (septembre 2023). Lorsque des
différences importantes dues aux versions sont à noter, elles sont
indiquées aussi clairement que possible.

### Sommaire

1. Instance
2. Fichiers
3. Contenu physique des fichiers
4. Architecture des processus
5. Architecture mémoire
6. Protocole de communication
7. Gestion des connexions
8. Gestion des transactions
9. Gestion des objets
10. Planification des requêtes
11. Sauvegarde et restauration
12. Réplication
13. Statistiques d'activité
14. Collecte et traitement des traces
15. Maintenance
16. Sécurité

## PostgreSQL - Administration et exploitation de vos bases de données

4 ème édition de ce livre écrit par:

* Sébastien Lardière

Lien vers [PostgreSQL - Administration et exploitation de vos bases de données](https://www.eyrolles.com/Informatique/Livre/postgresql-9782409011467/)

* EAN: 9782409011467
* ISBN: 978-2-409-01146-7

### Présentation

![image](/administration-exploit-bases-de-donnes.jpg "PostgreSQL - Administration et exploitation de vos bases de données"){.align-right}

L'administrateur de bases de données, le technicien d'exploitation et
le développeur trouveront dans ce livre les informations indispensables
pour exploiter au mieux toutes les possibilités de PostgreSQL (en
version 10 au moment de la rédaction).

Les premiers chapitres du livre couvrent l'installation de PostgreSQL
sur Windows et GNU/Linux ainsi que la préparation de l'environnement
d'exécution du serveur. L'auteur présente ensuite les applications
clientes pouvant être utilisées, les différents paramètres de sécurité
et les différents aspects de PostgreSQL concernant le support du langage
SQL. Les chapitres qui suivent introduisent la programmation dans
PostgreSQL et détaillent l'administration et l'exploitation (de la
configuration du serveur aux différentes tâches d'exploitation, en
passant par les sauvegardes). Un chapitre présente des outils annexes
enrichissant l'utilisation de PostgreSQL. Enfin, l'auteur introduit le
thème de la réplication des données entre différents serveurs, en
étudiant la réplication physique et logique intégrée à PostgreSQL ainsi
que l'outil Slony.

### Sommaire

1. Installation
2. Initialisation du système de fichiers
3. Connexions
4. Définition des données
5. Programmation
6. Exploitation
7. Outils
8. Réplication

## PostgreSQL - Entraînez-vous à créer et programmer une base de données relationnelle

Livre écrit par:

* François-Marie Colonna

Lien vers [PostgreSQL - Entraînez-vous à créer et programmer une base de données relationnelle](https://www.eyrolles.com/Informatique/Livre/postgresql-entrainez-vous-a-creer-et-programmer-une-base-de-donnees-relationnelle-9782746043817/)

* EAN: 9782746043817
* ISBN: 978-2-7460-4381-7

### Présentation

![image](/creer-programmer-base-de-donnes-relationnelle.jpg "PostgreSQL - Entraînez-vous à créer et programmer une base de données relationnelle"){.align-right}

Conçu par un formateur, ce livre sur PostgreSQL est destiné à un public
de lecteurs débutants ou initiés, déjà familiers de l'utilisation
d'une base de données relationnelle.

Au travers d'un travail pratique dont le fil conducteur s'étend sur
les 7 premiers chapitres, les exercices proposés couvrent la conception
de la base de données (création de tables, de types de données, de
domaines), l'interrogation de la base à l'aide de requêtes SQL
(sélection, insertion, mise à jour, suppression), les transactions
(niveaux d'isolation, verrouillage) et la programmation côté serveur
(vues, règles et déclencheurs).

Les pré-requis proposés au début de chaque chapitre permettent au
lecteur d'évaluer précisément ses connaissances avant d'aborder les
exercices.

Le dernier chapitre est un exercice de synthèse qui reprend sur un sujet
différent toutes les notions abordées dans les premiers chapitres du
livre. 209 QCM - 81 travaux pratiques et leurs corrigés - Près de 30 H
de mise en pratique.

### Sommaire

1. Connexion à PostgreSQL et création des tables
2. Requêtes SQL de base
3. Requêtes SQL avancées
4. Vues, règles, droits et tables système
5. Transactions et concurrence
6. Fonctions SQL et langages procéduraux
7. Déclencheurs
8. TP de synthèse - Gestion d'une librairie

---

---
url: /services.md
---

# Prestation autour de PostgreSQL

* [Sociétés de services](./societes.md)
* [Hébergeurs](./hebergeurs.md)

---

---
url: /services/societes.md
description: Société proposant des services et prestations autour de PostgreSQL
---

# Société de services

Liste des sociétés assurants de la prestation de services autour de
PostgreSQL (Triées par ordre alphabétique)

* [2ndQuadrant](https://2ndquadrant.com)
* [5432 Tech](https://5432.tech/grav/) (non affilié à 5432.fr)
* [Adrien Nayrat](https://pro.anayrat.info/)
* [AgoraTIC](https://agoratic.com/)
* [Camptocamp SA](https://camptocamp.com/postgresql)
* [Dalibo](https://www.dalibo.com/)
* [Data Bene](https://www.data-bene.io/fr/)
* [GCII](https://gcii.fr/)
* [Hybrix](https://www.hybrix.fr/)
* [LOXODATA](https://www.loxodata.com/)
* [Mirounga](https://mirounga.fr/postgresql)
* [Openska](https://openska.com/)
* [SIGMAZ Consilium](https://sigmaz-consilium.fr/postgresql/)
* [splendiddata](https://www.splendiddata.com/)
