Nouveau : Datasets open source gratuits disponibles !Decouvrir →
🐘
Avance 30 min PostgreSQL

PostgreSQL : guide avance

Pourquoi PostgreSQL : guide avance ?

Au sein d'une organisation moderne, la gestion et l'analyse des données jouent un rôle crucial dans la prise de décision et le développement des applications. PostgreSQL est une base de données relationnelle open source qui offre une gamme complète de fonctionnalités, y compris les transactions ACID, le stockage extensible, la sécurité robuste et la performance élevée. Un développeur senior en PostgreSQL a besoin de connaître ces concepts pour développer des applications performantes, évolutives et sécurisées.

Un cas d'usage concret : un système de gestion de projet nécessite une base de données robuste pour stocker les informations sur les tâches, les utilisateurs, les projets et leurs relations. PostgreSQL permet de gérer ces données avec des transactions ACID, ce qui est essentiel pour assurer la cohérence des données même en présence de panneaux ou de conflits.

Prerequis

  • Connaissance avancée de SQL (SELECT, JOIN, GROUP BY, etc.)
  • Compréhension des concepts d'objets relationnels (tables, indexations, clés primaires)
  • Familiarité avec les transactions ACID et leurs implications
  • Connaissance des types de données disponibles en PostgreSQL (texte, nombre, date, etc.)
  • Expérience avec le terminal et la ligne de commande

Outils à installer

  • PostgreSQL : Version 13 ou ultérieure
  • pgAdmin : Pour l'interface graphique de gestion de base de données (optionnel mais recommandé)
  • PostgreSQL Client : Pour accéder au serveur PostgreSQL depuis un terminal

Concepts fondamentaux

Indexation

L'indexation est un mécanisme qui améliore la vitesse de recherche des données. Un index crée une structure secondaire sur une colonne ou un ensemble de colonnes d'une table, permettant aux requêtes de s'exécuter plus rapidement.

-- Crée un index sur la colonne 'user_id' dans la table 'tasks'
CREATE INDEX idx_user_id ON tasks(user_id);

Partitionnement

Le partitionnement consiste à diviser une grande table en plusieurs parties plus petites et plus faciles à gérer. Cela améliore les performances des requêtes et facilite le maintien et la gestion de la base de données.

-- Crée une table分区 'tasks' par mois
CREATE TABLE tasks (
    task_id SERIAL PRIMARY KEY,
    user_id INT NOT NULL,
    task_name VARCHAR(255) NOT NULL,
    created_date DATE NOT NULL
)
PARTITION BY RANGE (created_date);

-- Crée des partitions spécifiques pour chaque mois
CREATE TABLE tasks_2023_q1 PARTITION OF tasks
FOR VALUES FROM ('2023-01-01') TO ('2023-04-01');

CREATE TABLE tasks_2023_q2 PARTITION OF tasks
FOR VALUES FROM ('2023-04-01') TO ('2023-07-01');

Cryptage des données

PostgreSQL offre la possibilité de crypter les données stockées dans la base de données. Cela permet une meilleure sécurité en protégeant les informations sensibles.

-- Installe le module 'pgcrypto'
CREATE EXTENSION IF NOT EXISTS pgcrypto;

-- Crée une colonne avec un hash MD5 pour stocker des mots de passe cryptés
ALTER TABLE users ADD COLUMN password_hash BYTEA;
UPDATE users SET password_hash = crypt(password, gen_salt('bf'));

Transactions

Les transactions ACID (Atomicité, Cohérence, Isolation, Durabilité) garantissent que les opérations sur la base de données soient cohérentes et fiables. PostgreSQL prend en charge les transactions explicites et implicites.

-- Démarre une transaction explicite
BEGIN;

UPDATE tasks SET status = 'completed' WHERE task_id = 123;
DELETE FROM logs WHERE task_id = 123;

COMMIT; -- Valide la transaction

-- ROLLBACK ; -- Annule la transaction en cas d'erreur

Mise en pratique : projet fil rouge - Gestionnaire de tâches

Dans cet exemple, nous allons créer un simple gestionnaire de tâches en utilisant PostgreSQL. Ce projet comprendra les fonctionnalités suivantes :

  • Ajout et modification des tâches
  • Suppression des tâches
  • Consultation des tâches

Étape 1 : Créer la base de données et les tables

-- Crée une nouvelle base de données
CREATE DATABASE task_manager;

-- Connecte-vous à la base de données
\c task_manager

-- Crée la table 'users'
CREATE TABLE users (
    user_id SERIAL PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE
);

-- Crée la table 'tasks'
CREATE TABLE tasks (
    task_id SERIAL PRIMARY KEY,
    user_id INT NOT NULL REFERENCES users(user_id),
    task_name VARCHAR(255) NOT NULL,
    description TEXT,
    created_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    completed BOOLEAN DEFAULT FALSE
);

Étape 2 : Créer les fonctions SQL

-- Fonction pour ajouter une tâche
CREATE OR REPLACE FUNCTION add_task(user_id INT, task_name VARCHAR(255), description TEXT) RETURNS VOID AS $$
BEGIN
    INSERT INTO tasks (user_id, task_name, description)
    VALUES (user_id, task_name, description);
END;
$$ LANGUAGE plpgsql;

-- Fonction pour mettre à jour une tâche
CREATE OR REPLACE FUNCTION update_task(task_id INT, task_name VARCHAR(255), description TEXT) RETURNS VOID AS $$
BEGIN
    UPDATE tasks SET task_name = task_name, description = description WHERE task_id = task_id;
END;
$$ LANGUAGE plpgsql;

-- Fonction pour supprimer une tâche
CREATE OR REPLACE FUNCTION delete_task(task_id INT) RETURNS VOID AS $$
BEGIN
    DELETE FROM tasks WHERE task_id = task_id;
END;
$$ LANGUAGE plpgsql;

Étape 3 : Créer un script Python pour interagir avec la base de données

## requirements.txt
psycopg2-binary==2.9.1

## main.py
import psycopg2

def connect():
    conn = psycopg2.connect(
        dbname="task_manager",
        user="your_username",
        password="your_password",
        host="localhost"
    )
    return conn

def add_task(user_id, task_name, description):
    conn = connect()
    cursor = conn.cursor()
    cursor.callproc('add_task', (user_id, task_name, description))
    conn.commit()
    cursor.close()
    conn.close()

def update_task(task_id, task_name, description):
    conn = connect()
    cursor = conn.cursor()
    cursor.callproc('update_task', (task_id, task_name, description))
    conn.commit()
    cursor.close()
    conn.close()

def delete_task(task_id):
    conn = connect()
    cursor = conn.cursor()
    cursor.callproc('delete_task', (task_id,))
    conn.commit()
    cursor.close()
    conn.close()

Étape 4 : Exécuter les fonctions Python

python main.py

Erreurs fréquentes et debugging

Erreur 1 : Violation d'intégrité référentielle

Message d'erreur :

ERROR:  insert or update on table "tasks" violates foreign key constraint "fk_user_id"
DETAIL:  Key (user_id)=(5) is not present in table "users".

Code incorrect :

INSERT INTO tasks (user_id, task_name, description)
VALUES (5, 'Task 1', 'Description of Task 1');

Code correct :

INSERT INTO users (username, email)
VALUES ('user1', 'user1@example.com');

INSERT INTO tasks (user_id, task_name, description)
VALUES ((SELECT user_id FROM users WHERE username = 'user1'), 'Task 1', 'Description of Task 1');

Erreur 2 : Transaction non valide

Message d'erreur :

ERROR:  current transaction is aborted, commands ignored until end of transaction block

Code incorrect :

BEGIN;

UPDATE tasks SET status = 'completed' WHERE task_id = 123;
DELETE FROM logs WHERE task_id = 123; -- Erreur ici car la table logs n'existe pas

COMMIT;

Code correct :

BEGIN;

UPDATE tasks SET status = 'completed' WHERE task_id = 123;

-- Annule la transaction en cas d'erreur
ROLLBACK;

Erreur 3 : Utilisation incorrecte de l'index

Message d'erreur :

ERROR:  index "idx_user_id" does not exist

Code incorrect :

SELECT * FROM tasks WHERE user_id = 100;

Code correct :

-- Assurez-vous que l'index existe avant de l'utiliser
CREATE INDEX idx_user_id ON tasks(user_id);

SELECT * FROM tasks WHERE user_id = 100;

Pour aller plus loin

1. Partitionnement vertical et horizontal

L'apprentissage du partitionnement vertical (diviser des tables en plusieurs colonnes) et horizontal (diviser la base de données en plusieurs instances) peut grandement améliorer les performances et la scalabilité d'une application PostgreSQL.

2. Utilisation des triggers

Les triggers permettent de définir des actions automatiques à effectuer lorsqu'un événement spécifique se produit dans la base de données, tels que l'insertion, la mise à jour ou la suppression de lignes.

3. Optimisation des requêtes complexes

L'apprentissage des techniques d'optimisation des requêtes complexes, telles que l'utilisation de sous-requêtes, la jointure de tables et l'indexation appropriée, peut grandement améliorer les performances des applications PostgreSQL.

Défi pratique

Défi : Créez un gestionnaire de contacts en utilisant PostgreSQL et Python. Le système devrait permettre d'ajouter, modifier, supprimer et consulter des contacts.

  • Conseils :
    • Utilisez les tables users et contacts pour stocker les informations.
    • Créez des fonctions SQL pour chaque opération (ajout, modification, suppression).
    • Écrivez un script Python pour interagir avec la base de données.

Besoin d'aide sur PostgreSQL ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Comment optimiser les performances des requêtes SQL sur PostgreSQL?
Pour optimiser les performances des requêtes SQL sur PostgreSQL, il est important d'analyser les plans de requête avec l'utilitaire `EXPLAIN`, d'ajuster l'optimisation des index, et de réduire la fragmentation des tables en utilisant des commandes comme `VACUUM` et `ANALYZE`. Il peut également être utile d'étudier la configuration du serveur PostgreSQL pour s'assurer qu'elle est optimisée pour le volume de travail.
Comment gérer les transactions dans PostgreSQL?
Dans PostgreSQL, les transactions sont gérées à l'aide des mots-clés `BEGIN`, `COMMIT` et `ROLLBACK`. Une transaction commence avec `BEGIN`, effectue un ensemble d'opérations SQL, puis est validée avec `COMMIT` ou annulée avec `ROLLBACK` si une erreur se produit. Il est recommandé de mettre en place des transactions pour assurer l'intégrité des données et la cohérence des opérations.
Quelles sont les meilleures pratiques pour la sécurité dans PostgreSQL?
Pour renforcer la sécurité dans PostgreSQL, il est important de définir un mot de passe fort pour l'utilisateur administrateur (`postgres`), d'activer l'authentification par mot de passe plutôt que la connexion locale, et de restreindre les privilèges des utilisateurs en accordant uniquement ce qui est nécessaire. Il est également recommandé de mettre en place un pare-feu et de régulièrement effectuer des sauvegardes sécurisées de la base de données.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.