Dans le tutoriel d’aujourd’hui, je vais vous montrer comment utiliser le constructeur de requêtes Knex.js dans des applications Node.js afin d’interagir avec la base de données PostgreSQL. Vous vous demandez ce qu’est un constructeur de requêtes ? Pas d’inquiétude, je vais vous l’expliquer ; gardez simplement à l’esprit que ceci est un tutoriel destiné à ceux qui maîtrisent déjà Node.js, TypeScript et qui connaissent aussi la base Postgres.
Si vous avez besoin de connaissances de base ou d’un renforcement en TS, utilisez ce tutoriel.
#1 – Pilote natif x Query Builder x ORM
Lorsque nous allons créer une application qui se connecte à une base de données pour interroger et enregistrer des données, nous avons trois approches possibles:
- en utilisant le pilote natif de la base pour notre langage;
- en utilisant un constructeur de requêtes (query builder);
- en utilisant un ORM (Object-Relational Mapping);
Chacune de ces trois approches présente ses avantages et ses inconvénients, ainsi que ses partisans et ses détracteurs. En résumé, voici le comparatif:
- Pilote: la forme “officielle”, avec la meilleure performance et qui demande le plus de travail (moins productive) car elle implique l’utilisation directe de SQL et aucune abstraction de données. Dans le cas de PostgreSQL par exemple, cela reviendrait à développer en utilisant le package pg, comme nous l’avons fait dans ce tutoriel.
- ORM: la forme la plus “courante” et la plus productive pour développer. Dans ce mode, vous manipulez uniquement des objets, le niveau le plus élevé d’abstraction en programmation, sans toucher au SQL. Cependant, la conversion constante entre objets et données rend cette approche plus lente en termes de performance. Un exemple célèbre est Sequelize, que nous avons déjà utilisé dans ce tutoriel.
- Query Builder: dans cette approche, nous utilisons des objets pour construire les requêtes, ce qui représente un degré d’abstraction moyen, mais plus léger que celui des ORM, et plus productif que de tout gérer manuellement comme avec le pilote natif. On peut dire que les query builders comme Knex.js constituent le compromis entre performance et productivité dans le monde du développement.
Ayant compris ce point initial sur les approches, avançons.
#2 – Environnement et Projet
Si vous n’avez jamais programmé avec Node et Postgre avant, je vous laisse ci-dessous une vidéo montrant l’installation de l’environnement.
Lorsque l’environnement est prêt, vous pouvez créer la base et la table pour notre application.
Maintenant, créez un dossier sur votre machine pour le projet, j’utiliserai le nom “crud-knex-postgresql”. Ouvrez le terminal et dans ce dossier lancez un “npm init -y” pour initialiser le projet et créer le fichier package.json.
Toujours dans le terminal, installez les dépendances dont nous aurons besoin dans ce tutoriel
npm i pg knex dotenvÀ savoir :
- pg: paquet contenant le driver natif pour PostgreSQL;
- Knex: paquet du constructeur de requêtes Knex.js;
- DotEnv: paquet pour la gestion des variables d’environnement;
D’autres options de bases de données possibles seraient CockroachDB, MS SQL Server, MySQL, MariaDB, SQLite3, Better-SQLite3, Oracle et Amazon Redshift, il suffirait de changer le connecteur (pg).
Et maintenant les dépendances de développement :
npm i -D typescript tsx @types/nodeÀ savoir :
- TypeScript: paquet pour utiliser TypeScript dans le projet;
- TSX: paquet qui permet d’exécuter TS directement, sans le transpiler en JS;
- @types/node: paquet pour les types de Node.js natif;
Et ensuite, initialisez TypeScript dans le projet.
npx tsc --initEt ajustez votre package.json pour que le type du projet soit module, au lieu de commonjs et le script de démarrage.
"type": "module",
"scripts": {
"start": "tsx src/index.ts"
},
Faites cela, créez maintenant un fichier .env à la racine de votre projet et placez-y les variables d’environnement suivantes, dûment configurées avec les données du serveur PostgreSQL que vous allez utiliser.
- NODE_ENV=development
- DB_HOST=localhost
- DB_PORT=5432
- DB_USER=luiztools
- DB_PASSWORD=
- DB_DATABASE=luiztools
- DEBUG=knex:query
La variable debug sert à ce que Knex affiche dans le terminal le SQL qu’il exécute sur la base de données, utile pendant le développement.
Et avec cela, nous terminons la configuration initiale du projet.
#3 – Configuration de Knex
La première étape consiste à créer un dossier src à la racine du projet et, à l’intérieur, un dossier config, où nous allons stocker les fichiers de configuration. Le premier fichier de configuration dont nous allons avoir besoin est knex.ts, qui comme son nom l’indique, configure le query builder.
import "dotenv/config";
import Knex from "knex";
const knex = Knex({
client: "pg",
connection: {
host: `${process.env.DB_HOST}`,
port: Number(process.env.DB_PORT),
user: `${process.env.DB_USER}`,
password: `${process.env.DB_PASSWORD}`,
database: `${process.env.DB_DATABASE}`,
},
pool: {
min: 2,
max: 10,
},
});
export const onDatabaseConnect = () => knex.raw("SELECT 1");
export default knex;
Nous commençons par importer les variables d’environnement, puis le paquet Knex. Comme c’est courant avec les abstractions de base de données, nous devons d’abord diriger notre query builder vers notre base (connection), préciser quel client de base de données nous utilisons (pg) et les configurations du pool de connexions, optionnelles mais recommandées pour de meilleures performances.
Après les configurations de connexion de Knex, je crée et exporte une fonction qui teste la connexion. Si tout est correct, cette fonction retournera une ligne contenant le chiffre 1, sinon une erreur.
Enfin, j’exporte par défaut l’objet Knex, correctement connecté.
Maintenant, passons à index.ts qui doit exister dans src pour écrire un code initial qui teste la connexion en utilisant Knex.




