Rust et PostgreSQL : écrire des requêtes performantes sans douleur

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Rust et PostgreSQL : un duo qui rend votre code plus rapide

\n\n

Avez-vous déjà réfléchi à pourquoi de plus en plus de développeurs backend passent à Rust ? La réponse est simple : Rust offre un contrôle sur la mémoire et la vitesse, tandis que PostgreSQL offre un contrôle sur les données. Ensemble, ils forment une combinaison capable de supporter des centaines de milliers de requêtes par seconde sans ralentissements ni fuites.

\n\n

Dans ce guide, nous allons voir comment faire collaborer Rust et PostgreSQL. Vous apprendrez à configurer la connexion, exécuter des requêtes, éviter les injections SQL et construire des applications asynchrones. C'est parti !

\n\n

Pourquoi Rust et PostgreSQL ?

\n\n

Rust n'est pas qu'un langage à la mode. Son système de possession (ownership) et le borrow checker garantissent que vous n'aurez pas de null pointer ni de références pendantes. Et PostgreSQL n'est pas qu'une simple base de données. C'est un outil puissant avec le support du JSON, de la recherche en texte intégral et des transactions complexes.

\n\n

Lorsque vous combinez Rust et PostgreSQL, vous obtenez :

\n
    \n
  • Sécurité — Rust ne vous laissera pas envoyer accidentellement du SQL incorrect.
  • \n
  • Performance — les pilotes asynchrones fonctionnent au niveau du C.
  • \n
  • Contrôle — vous décidez quand et comment récupérer les données.
  • \n
\n\n

Installation et configuration de l'environnement

\n\n

Avant d'écrire du code, assurez-vous d'avoir installé :

\n
    \n
  • Rust (dernière version stable) — rustup update
  • \n
  • PostgreSQL (localement ou via Docker) — docker run --name pg -e POSTGRES_PASSWORD=pass -p 5432:5432 -d postgres
  • \n
  • La bibliothèque libpq-dev (pour Linux) ou son équivalent sur Mac/Windows
  • \n
\n\n

Créez un nouveau projet :

\n\n
cargo new rust-postgres-guide\ncd rust-postgres-guide
\n\n

Choix du pilote : tokio-postgres vs sqlx

\n\n

Il existe deux approches principales pour travailler avec PostgreSQL en Rust :

\n
    \n
  • tokio-postgres — un pilote asynchrone de bas niveau. Offre un contrôle total.
  • \n
  • sqlx — un pilote asynchrone de haut niveau avec vérification des requêtes à la compilation.
  • \n
\n\n

Pour les projets avancés, je recommande sqlx — il est plus pratique et plus sûr. Mais pour un contrôle maximal, utilisez tokio-postgres.

\n\n

Ajoutons les dépendances dans Cargo.toml :

\n\n
[dependencies]\ntokio = { version = "1", features = ["full"] }\nsqlx = { version = "0.7", features = ["runtime-tokio-rustls", "postgres"] }\nserde = { version = "1", features = ["derive"] }\n
\n\n

Première connexion : Rust et PostgreSQL se rencontrent

\n\n

Écrivons un exemple simple qui se connecte à la base et retourne la version de PostgreSQL.

\n\n
use sqlx::postgres::PgPoolOptions;\nuse std::error::Error;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn Error>> {\n    // Chaîne de connexion : postgres://utilisateur:motdepasse@hôte:port/bd\n    let database_url = "postgres://postgres:pass@localhost:5432/postgres";\n    \n    // Création d'un pool de connexions (connexions réutilisables)\n    let pool = PgPoolOptions::new()\n        .max_connections(5)\n        .connect(database_url)\n        .await?;\n\n    // Exécution de la requête\n    let row: (String,) = sqlx::query_as("SELECT version()")\n        .fetch_one(&pool)\n        .await?;\n\n    println!("Version PostgreSQL : {}", row.0);\n    Ok(())\n}
\n\n

Exécutez le code : cargo run. Si tout est correctement configuré, vous verrez la version de PostgreSQL. Notez PgPoolOptions — le pool de connexions est obligatoire en production. Il réutilise les connexions et n'en crée pas de nouvelles pour chaque requête.

\n\n

Création de tables et opérations CRUD

\n\n

Créons maintenant une table users et effectuons les opérations de base : insertion, lecture, mise à jour, suppression.

\n\n

Migration : création de la table

\n\n

Dans sqlx, les migrations sont des fichiers SQL séparés. Créez un dossier migrations et un fichier

Blogs

Book Recommendations