Création d'une extension de génération de QRCode en SVG pour PostgreSQL
Comment j'ai créé pgqrcode, une extension PostgreSQL qui génère des QR codes directement en SVG depuis une requête SQL.
Quand vous avez besoin de générer des QR codes à la volée dans une application, la logique classique est de le faire côté backend. Mais parfois, le plus efficace c’est de le faire directement en base de données.
Le besoin
Dans un projet où nous devions générer des milliers de QR codes pour des documents traçables, le pipeline classique (requête BDD → backend → librairie QR → rendu SVG) ajoutait de la latence et de la complexité inutiles.
L’idée : et si PostgreSQL pouvait générer le QR code directement ?
pgqrcode : l’extension
pgqrcode est une extension PostgreSQL écrite en C qui génère des QR codes au format SVG directement depuis une requête SQL :
SELECT qrcode_svg('https://kolapsis.com', 256);
Cette requête retourne un SVG complet, prêt à être intégré dans un document HTML ou PDF. Le deuxième paramètre est la taille en pixels.
Utilisation concrète
Imaginons une table de produits avec des identifiants uniques. Vous pouvez générer les QR codes à la volée dans une vue :
CREATE VIEW products_with_qr AS
SELECT
p.id,
p.name,
p.reference,
qrcode_svg(
format('https://app.domain.com/product/%s', p.reference),
200
) as qr_svg
FROM products p;
Chaque produit a maintenant son QR code généré dynamiquement, sans aucune logique backend supplémentaire.
Pourquoi SVG ?
Le SVG est vectoriel — il s’adapte à toutes les tailles sans perte de qualité. Pas besoin de gérer des fichiers PNG à différentes résolutions. Et comme c’est du texte, ça se stocke, se transmet et se cache facilement.
Installation
L’extension se compile et s’installe comme n’importe quelle extension PostgreSQL :
git clone https://github.com/btouchard/pgqrcode.git
cd pgqrcode
make
make install
# Dans PostgreSQL
CREATE EXTENSION pgqrcode;
Compatible PostgreSQL 13+. Le code est disponible sur GitHub.
C’est un petit projet, mais qui illustre bien la puissance des extensions PostgreSQL — quand la base de données peut faire le travail, pourquoi ajouter une couche supplémentaire ?
Besoin d'aide sur ce sujet ?
Réserver un créneau