<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Base De Données on Dev TLDRLSS</title>
        <link>https://dev.tldrlss.com/fr/categories/base-de-donn%C3%A9es/</link>
        <description>Recent content in Base De Données on Dev TLDRLSS</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>fr</language>
        <lastBuildDate>Tue, 19 May 2026 18:10:00 +0800</lastBuildDate><atom:link href="https://dev.tldrlss.com/fr/categories/base-de-donn%C3%A9es/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Ne vous laissez pas tromper par la désinvolture de SQLite ! Quels sont les pièges des types dynamiques ? Pourquoi ALTER TABLE est-il à moitié opérationnel ? Comment construire une architecture de programmation défensive en Node.js pour des mises à niveau de schéma sans douleur ?</title>
        <link>https://dev.tldrlss.com/fr/article/2026/05/sqlite-pitfall-intro/</link>
        <pubDate>Tue, 19 May 2026 18:10:00 +0800</pubDate>
        
        <guid>https://dev.tldrlss.com/fr/article/2026/05/sqlite-pitfall-intro/</guid>
        <description>&lt;img src="https://dev.tldrlss.com/global-assets/images/database/sqlite-type-pitfall-1.jpg" alt="Featured image of post Ne vous laissez pas tromper par la désinvolture de SQLite ! Quels sont les pièges des types dynamiques ? Pourquoi ALTER TABLE est-il à moitié opérationnel ? Comment construire une architecture de programmation défensive en Node.js pour des mises à niveau de schéma sans douleur ?" /&gt;&lt;p&gt;Imaginez un bac de recyclage sur lequel vous avez clairement apposé une étiquette indiquant &amp;quot;Bouteilles en plastique uniquement&amp;quot;, mais lorsque quelqu&amp;rsquo;un y jette un morceau de papier, il l&amp;rsquo;accepte silencieusement sans un seul mot de protestation ?&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est l&amp;rsquo;expérience effrayante que vivent les développeurs lorsqu&amp;rsquo;ils découvrent le système de types de &lt;code&gt;SQLite&lt;/code&gt; pour la première fois.&lt;/p&gt;
&lt;p&gt;Si vous êtes habitué au style rigide d&amp;rsquo;agent des douanes de &lt;code&gt;PostgreSQL&lt;/code&gt; (où les types incorrects sont directement rejetés), la désinvolture de &lt;code&gt;SQLite&lt;/code&gt; pourrait vous faire douter de votre vie.&lt;/p&gt;
&lt;p&gt;Encore plus effrayant, lorsque vous souhaitez &lt;strong&gt;modifier la structure d&amp;rsquo;une table&lt;/strong&gt;, il vous dira :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;La table ne peut pas être modifiée directement. Veuillez construire une nouvelle maison, y déménager les meubles, puis faire sauter l&amp;rsquo;ancienne maison.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;sous-le-capot-sqlite-ne-possède-que-5-classes-de-stockage&#34;&gt;Sous le capot, SQLite ne possède que 5 classes de stockage
&lt;/h2&gt;&lt;p&gt;Peu importe les noms de types élégants que vous déclarez dans &lt;code&gt;CREATE TABLE&lt;/code&gt; (&lt;code&gt;VARCHAR(255)&lt;/code&gt;, &lt;code&gt;BIGINT&lt;/code&gt;, &lt;code&gt;DECIMAL&lt;/code&gt;), &lt;code&gt;SQLite&lt;/code&gt; sous le capot ne reconnaît que ces &lt;strong&gt;5 classes de stockage&lt;/strong&gt; :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Classe de stockage&lt;/th&gt;
          &lt;th&gt;Description&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;NULL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Valeur nulle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;INTEGER&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Entier (occupe automatiquement 1 à 8 octets selon l&amp;rsquo;importance de la valeur)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;REAL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Nombre à virgule flottante (fixé à 8 octets)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;TEXT&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Chaîne de caractères (encodage UTF-8 par défaut)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;strong&gt;BLOB&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Grand objet binaire (stocké exactement comme saisi)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Les types que vous définissez sur les colonnes &lt;strong&gt;sont simplement des &amp;quot;suggestions&amp;quot; pour &lt;code&gt;SQLite&lt;/code&gt;, pas des &amp;quot;règles obligatoires&amp;quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;C&amp;rsquo;est ce qu&amp;rsquo;on appelle la &lt;strong&gt;&amp;quot;Type Affinity&amp;quot; (Affinité de types)&lt;/strong&gt;. &lt;code&gt;SQLite&lt;/code&gt; tentera de convertir vos données vers le type suggéré, mais s&amp;rsquo;il ne le peut pas, il insérera simplement les données d&amp;rsquo;origine sans générer d&amp;rsquo;erreur.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Vous pouvez déclarer une colonne &lt;code&gt;age INTEGER&lt;/code&gt; dans &lt;code&gt;SQLite&lt;/code&gt; puis y insérer la chaîne &lt;code&gt;&#39;toujours dix-huit ans&#39;&lt;/code&gt;; il l&amp;rsquo;acceptera volontiers.&lt;/p&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;trois-pièges-de-types-les-plus-faciles-à-commettre&#34;&gt;Trois pièges de types les plus faciles à commettre
&lt;/h2&gt;&lt;h3 id=&#34;piège-1--pas-de-boolean-nativo&#34;&gt;Piège 1 : Pas de Boolean nativo
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;SQLite&lt;/code&gt; &lt;strong&gt;n&amp;rsquo;a pas de type booléen&lt;/strong&gt;. &lt;code&gt;True&lt;/code&gt; et &lt;code&gt;False&lt;/code&gt; ne peuvent être représentés que par les entiers &lt;code&gt;1&lt;/code&gt; et &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Lorsque vous récupérez des données de &lt;code&gt;SQLite&lt;/code&gt; à l&amp;rsquo;aide de &lt;code&gt;Node.js&lt;/code&gt;, vous obtiendrez le nombre &lt;code&gt;1&lt;/code&gt; ou &lt;code&gt;0&lt;/code&gt;, pas &lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Si vous effectuez directement une vérification telle que &lt;code&gt;if (user.is_admin === true)&lt;/code&gt;, elle ne sera jamais vraie.&lt;/p&gt;
&lt;h3 id=&#34;piège-2--pas-de-type-datetime&#34;&gt;Piège 2 : Pas de type Date/Time
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;SQLite&lt;/code&gt; &lt;strong&gt;n&amp;rsquo;a pas de type date/heure&lt;/strong&gt;. Vous ne pouvez stocker le temps que sous forme de :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Méthode de stockage&lt;/th&gt;
          &lt;th&gt;Exemple&lt;/th&gt;
          &lt;th&gt;Avantages &amp;amp; Inconvénients&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;TEXT (chaîne ISO-8601)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;&#39;2026-05-19T18:00:00Z&#39;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Le plus recommandé&lt;/strong&gt;, grande lisibilité, conversion parfaite lors du passage à PostgreSQL à l&amp;rsquo;avenir&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;INTEGER (Unix Timestamp)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;1747656000&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Faible encombrement, mais illisible pour l&amp;rsquo;homme&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ne stockez jamais de dates dans des formats personnalisés arbitraires comme &lt;code&gt;19/05/2026 18:00&lt;/code&gt;, sinon la future migration de données sera une catastrophe.&lt;/p&gt;
&lt;h3 id=&#34;piège-3--insérer-une-chaîne-dans-une-colonne-integer-ne-générera-pas-derreur&#34;&gt;Piège 3 : Insérer une chaîne dans une colonne Integer ne générera pas d&amp;rsquo;erreur
&lt;/h3&gt;&lt;p&gt;Dans &lt;code&gt;PostgreSQL&lt;/code&gt;, insérer une chaîne dans une colonne &lt;code&gt;INTEGER&lt;/code&gt; génère une erreur immédiatement. Mais &lt;code&gt;SQLite&lt;/code&gt; essaiera seulement de la convertir silencieusement, et en cas d&amp;rsquo;échec, l&amp;rsquo;acceptera telle quelle.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Cela signifie que &lt;strong&gt;des données sales peuvent s&amp;rsquo;infiltrer silencieusement dans votre base de données&lt;/strong&gt; jusqu&amp;rsquo;à ce qu&amp;rsquo;un jour votre programme plante en raison de la réception d&amp;rsquo;un type inattendu, ce n&amp;rsquo;est qu&amp;rsquo;alors que vous découvrirez le problème.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;programmation-défensive--traiter-une-base-de-données-désinvolte-avec-une-attitude-stricte&#34;&gt;Programmation défensive : Traiter une base de données désinvolte avec une attitude stricte
&lt;/h2&gt;&lt;p&gt;Face à la désinvolture de &lt;code&gt;SQLite&lt;/code&gt;, vous devez construire &lt;strong&gt;des mécanismes de défense stricts&lt;/strong&gt; dans le développement avec &lt;code&gt;Node.js&lt;/code&gt; :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Niveau de défense&lt;/th&gt;
          &lt;th&gt;Outil&lt;/th&gt;
          &lt;th&gt;Rôle&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Garde au compile-time&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Capturer les types incorrects à l&amp;rsquo;étape d&amp;rsquo;écriture du code&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Validation d&amp;rsquo;entrée d&amp;rsquo;API&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Zod&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Valider les données entrantes strictement (s&amp;rsquo;assurer que age est toujours un nombre)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Conversion implicite de types&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Prisma / Drizzle ORM&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Gérer automatiquement les différences de types entre SQLite et PostgreSQL&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Déplacer le &lt;strong&gt;&amp;quot;videur de validation de données&amp;quot;&lt;/strong&gt; de la couche base de données vers la couche application &lt;code&gt;Node.js&lt;/code&gt; est une stratégie clé pour tirer parti de la rapidité de développement de SQLite tout en garantissant l&amp;rsquo;évolutivité future.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Lors de l&amp;rsquo;utilisation d&amp;rsquo;un ORM, tant que vous déclarez &lt;code&gt;type: &#39;boolean&#39;&lt;/code&gt; dans votre code, l&amp;rsquo;ORM le convertit automatiquement en &lt;code&gt;1/0&lt;/code&gt; lors de la sauvegarde dans &lt;code&gt;SQLite&lt;/code&gt;, et le reconvertit en &lt;code&gt;true/false&lt;/code&gt; lors de la lecture, masquant parfaitement les différences de types sous-jacentes.&lt;/p&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;alter-table-est-à-moitié-opérationnel--ce-qui-peut-et-ne-peut-pas-être-modifié&#34;&gt;ALTER TABLE est à moitié opérationnel : Ce qui peut et ne peut pas être modifié
&lt;/h2&gt;&lt;p&gt;Le support de &lt;code&gt;SQLite&lt;/code&gt; pour la modification des structures de tables est très limité :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Opération&lt;/th&gt;
          &lt;th&gt;Pris en charge&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Ajouter une colonne (&lt;code&gt;ADD COLUMN&lt;/code&gt;)&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Oui&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Renommer une colonne (&lt;code&gt;RENAME COLUMN&lt;/code&gt;)&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Oui&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Supprimer une colonne (&lt;code&gt;DROP COLUMN&lt;/code&gt;)&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Oui&lt;/strong&gt; (dans les versions plus récentes)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Renommer une table (&lt;code&gt;RENAME TO&lt;/code&gt;)&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Oui&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Modifier le type d&amp;rsquo;une colonne&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Non&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Ajouter/supprimer les contraintes &lt;code&gt;UNIQUE&lt;/code&gt;, &lt;code&gt;NOT NULL&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Non&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Modifier la clé primaire&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Non&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Modifier la clé étrangère&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Non&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Une fois que vous devez effectuer l&amp;rsquo;une des modifications &amp;quot;non prises en charge&amp;quot;, &lt;code&gt;SQLite&lt;/code&gt; exige que vous exécutiez la stratégie de &lt;strong&gt;&amp;quot;recréer et déplacer&amp;quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;les-quatre-étapes-pour-recriar-et-déplacer--la-façon-de-mettre-à-niveau-les-tables-de-sqlite&#34;&gt;Les quatre étapes pour recriar et déplacer : La façon de mettre à niveau les tables de SQLite
&lt;/h2&gt;&lt;p&gt;Comme cela ne peut pas être modifié directement, la pratique standard recommandée par les documents officiels est de &lt;strong&gt;construire une nouvelle maison, d&amp;rsquo;y déménager les meubles, de faire sauter l&amp;rsquo;ancienne maison et d&amp;rsquo;apposer la nouvelle plaque nominative&lt;/strong&gt; :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Étape&lt;/th&gt;
          &lt;th&gt;Action&lt;/th&gt;
          &lt;th&gt;Description&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;Créer une nouvelle table&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;CREATE TABLE users_new (...)&lt;/code&gt; en utilisant la structure correcte&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;Copier les données&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;INSERT INTO users_new SELECT ... FROM users&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;Supprimer l&amp;rsquo;ancienne table&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;DROP TABLE users&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;Renommer la table&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;ALTER TABLE users_new RENAME TO users&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Ces quatre étapes doivent être exécutées &lt;strong&gt;d&amp;rsquo;une seule traite&lt;/strong&gt;; toute coupure de courant ou crash d&amp;rsquo;application à mi-chemin entraînera la perte de données.&lt;/p&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;garantir-que-les-mises-à-niveau-ne-perdent-pas-de-données--deux-lignes-de-défense-de-sécurité&#34;&gt;Garantir que les mises à niveau ne perdent pas de données : Deux lignes de défense de sécurité
&lt;/h2&gt;&lt;h3 id=&#34;ligne-de-défense-1--défense-physique-copier-le-fichier-directement&#34;&gt;Ligne de défense 1 : Défense physique, copier le fichier directement
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;SQLite&lt;/code&gt; est essentiellement un simple fichier. Avant d&amp;rsquo;exécuter des modifications de schéma, copiez simplement le fichier &lt;code&gt;.db&lt;/code&gt; en tant que sauvegarde.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;fs&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;fs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;copyFileSync&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;my_project.db&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;my_project_backup.db&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Si les choses tournent mal, le remplacement du fichier restaure tout en un clin d&amp;rsquo;œil. C&amp;rsquo;est un avantage que d&amp;rsquo;autres grandes bases de données ne peuvent pas offrir.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;ligne-de-défense-2-enveloppe-de-transaction-la-machine-à-remonter-le-temps-de-la-base-de-données&#34;&gt;Ligne de défense 2: Enveloppe de Transaction, la machine à remonter le temps de la base de données
&lt;/h3&gt;&lt;p&gt;Enveloppez toutes les étapes de migration dans une seule &lt;code&gt;Transaction&lt;/code&gt;; si une étape échoue, tout le processus sera &lt;strong&gt;automatiquement annulé (Rollback)&lt;/strong&gt; comme si rien ne s&amp;rsquo;était passé.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Database&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;better-sqlite3&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Database&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;my_project.db&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;migrateData&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;transaction&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(()&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;=&amp;gt;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prepare&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;    CREATE TABLE users_new (
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;      id INTEGER PRIMARY KEY AUTOINCREMENT,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;      name TEXT NOT NULL,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;      age INTEGER NOT NULL DEFAULT 18
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;    )
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;  `&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prepare&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;    INSERT INTO users_new (id, name, age)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;    SELECT id, name, COALESCE(age, 18) FROM users
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;sb&#34;&gt;  `&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prepare&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;DROP TABLE users&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prepare&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;ALTER TABLE users_new RENAME TO users&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;try&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;migrateData&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;Table mise à niveau avec succès&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;catch&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;La mise à niveau a échoué, données restaurées en toute sécurité :&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;message&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;Fichier de sauvegarde + Liaison par Transaction&amp;quot;&lt;/strong&gt; constitue l&amp;rsquo;airbag de la migration de votre base de données.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;contrôlez-la-désinvolture-de-sqlite-avec-une-attitude-stricte&#34;&gt;Contrôlez la désinvolture de SQLite avec une attitude stricte
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Domptez la désinvolture de &lt;code&gt;SQLite&lt;/code&gt; avec une &lt;strong&gt;architecture stricte de couche d&amp;rsquo;application&lt;/strong&gt; pour profiter de sa vitesse de développement ultrarapide tout en évitant les dettes techniques futures.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Le système de types de SQLite est très désinvolte, et &lt;code&gt;ALTER TABLE&lt;/code&gt; présente de nombreuses limitations.&lt;/p&gt;
&lt;p&gt;Cependant, tant que vous effectuez la &lt;strong&gt;vérification des types TypeScript + validation Zod + l&amp;rsquo;abstraction ORM&lt;/strong&gt; du côté de &lt;code&gt;Node.js&lt;/code&gt;, combinées à la stratégie de sécurité de &lt;strong&gt;sauvegarde physique + Transaction&lt;/strong&gt;, vous pouvez profiter en toute sécurité de l&amp;rsquo;efficacité de développement offerte par &lt;code&gt;SQLite&lt;/code&gt; tout en ouvrant la voie à une migration aisée vers &lt;code&gt;PostgreSQL&lt;/code&gt; à l&amp;rsquo;avenir.&lt;/p&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;reference&#34;&gt;Reference
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://sqlite.org/datatype3.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Datatypes In SQLite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.runoob.com/sqlite/sqlite-data-types.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SQLite 数据类型 | 菜鸟教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.sqlite.org/lang_transaction.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Transaction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://sqlite.org/lang.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Query Language Understood by SQLite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/SQLite&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SQLite - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>N&#39;utilisez pas PostgreSQL pour tout ! Quels sont les avantages de l&#39;architecture embarquée et de la configuration zéro de SQLite ? Où sont les limites de SQLite ? Quand devriez-vous choisir SQLite et quand PostgreSQL ?</title>
        <link>https://dev.tldrlss.com/fr/article/2026/05/sqlite-intro/</link>
        <pubDate>Tue, 19 May 2026 18:00:00 +0800</pubDate>
        
        <guid>https://dev.tldrlss.com/fr/article/2026/05/sqlite-intro/</guid>
        <description>&lt;img src="https://dev.tldrlss.com/global-assets/images/database/sqlite-vs-postgresql-choice-2.jpg" alt="Featured image of post N&#39;utilisez pas PostgreSQL pour tout ! Quels sont les avantages de l&#39;architecture embarquée et de la configuration zéro de SQLite ? Où sont les limites de SQLite ? Quand devriez-vous choisir SQLite et quand PostgreSQL ?" /&gt;&lt;p&gt;Avez-vous déjà pensé au fait que le navigateur que vous ouvrez chaque jour, le logiciel de communication sur votre téléphone et même l&amp;rsquo;outil de prise de notes sur votre bureau cachent tous cette même base de données légère ?&lt;/p&gt;
&lt;p&gt;Elle ne nécessite l&amp;rsquo;installation d&amp;rsquo;aucun logiciel serveur, ne requiert aucune configuration de compte ou de mot de passe, et n&amp;rsquo;a même pas besoin d&amp;rsquo;une connexion Internet. C&amp;rsquo;est simplement un &lt;strong&gt;fichier&lt;/strong&gt;, qui repose tranquillement sur votre disque dur, prêt à vous servir à tout moment.&lt;/p&gt;
&lt;p&gt;Cette existence discrète, c&amp;rsquo;est &lt;code&gt;SQLite&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;quest-ce-que-sqlite--la-base-de-données-la-plus-déployée-au-monde&#34;&gt;Qu&amp;rsquo;est-ce que SQLite ? La base de données la plus déployée au monde
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;SQLite&lt;/code&gt; est un &lt;strong&gt;moteur de base de données relationnelle embarqué&lt;/strong&gt; écrit en C.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Il &lt;strong&gt;n&amp;rsquo;a pas de processus serveur indépendant&lt;/strong&gt;, mais est directement embarqué dans votre application pour s&amp;rsquo;exécuter.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C&amp;rsquo;est complètement différent de &lt;code&gt;PostgreSQL&lt;/code&gt; ou &lt;code&gt;MySQL&lt;/code&gt; avec lesquels vous êtes familier. Les bases de données traditionnelles sont des &lt;strong&gt;serveurs indépendants&lt;/strong&gt; qui s&amp;rsquo;exécutent séparément, et votre programme doit &amp;ldquo;communiquer&amp;rdquo; avec eux via un &lt;strong&gt;protocole réseau (TCP/IP)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;But &lt;code&gt;SQLite&lt;/code&gt; est différent ; c&amp;rsquo;est simplement un bloc de code, s&amp;rsquo;exécutant directement au sein de votre application, lisant et écrivant ce fichier &lt;code&gt;.db&lt;/code&gt; sur votre disque dur.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Dimension de comparaison&lt;/th&gt;
          &lt;th&gt;SQLite (Embarqué)&lt;/th&gt;
          &lt;th&gt;PostgreSQL (Client-Serveur)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Mode de fonctionnement&lt;/td&gt;
          &lt;td&gt;Directement embarqué dans l&amp;rsquo;application, pas de serveur indépendant&lt;/td&gt;
          &lt;td&gt;Processus serveur indépendant, via connexion réseau&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Configuration&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Configuration zéro&lt;/strong&gt;, pas d&amp;rsquo;installation, pas d&amp;rsquo;identifiants&lt;/td&gt;
          &lt;td&gt;Requiert installation, configuration compte/mot de passe &amp;amp; pare-feu&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Stockage des données&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Fichier unique multiplateforme&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Multiples fichiers sous le répertoire du serveur&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Méthode de sauvegarde&lt;/td&gt;
          &lt;td&gt;Copier directement ce fichier&lt;/td&gt;
          &lt;td&gt;Requiert des outils dédiés comme pg_dump&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;C&amp;rsquo;est précisément en raison de cette caractéristique &lt;strong&gt;&amp;ldquo;plug-and-play&amp;rdquo;&lt;/strong&gt; que &lt;code&gt;SQLite&lt;/code&gt; est devenu le moteur de base de données le plus déployé au monde.&lt;/p&gt;
&lt;p&gt;Des systèmes d&amp;rsquo;exploitation Android et iOS, aux navigateurs Chrome et Firefox, en passant par Adobe Lightroom, WhatsApp et même le système de vol de l&amp;rsquo;Airbus A350, il est partout.&lt;/p&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;utiliser-sqlite-dans-nodejs&#34;&gt;Utiliser SQLite dans Node.js
&lt;/h2&gt;&lt;p&gt;Si vous êtes un développeur Node.js, utiliser &lt;code&gt;SQLite&lt;/code&gt; est extrêmement simple. Vous n&amp;rsquo;avez pas besoin d&amp;rsquo;installer de logiciel de serveur de base de données sur votre ordinateur, il vous suffit d&amp;rsquo;installer un paquet npm pour commencer.&lt;/p&gt;
&lt;p&gt;Les options les plus couramment utilisées dans l&amp;rsquo;industrie aujourd&amp;rsquo;hui :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Nom du paquet&lt;/th&gt;
          &lt;th&gt;Caractéristiques&lt;/th&gt;
          &lt;th&gt;Scénario recommandé&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;sqlite3&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Le plus établi, prend en charge les API asynchrones&lt;/td&gt;
          &lt;td&gt;Lorsqu&amp;rsquo;il faut gérer de nombreuses tâches asynchrones en parallèle&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;better-sqlite3&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Excellentes performances&lt;/strong&gt;, conception d&amp;rsquo;API intuitive, extrêmement rapide&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Recommandation principale&lt;/strong&gt;, pour l&amp;rsquo;efficacité du développement et la vitesse d&amp;rsquo;exécution&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Créer une base de données et l&amp;rsquo;interroger avec &lt;code&gt;better-sqlite3&lt;/code&gt; prend moins de cinq minutes :&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Database&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;require&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;better-sqlite3&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;new&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;Database&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;my_project.db&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prepare&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;CREATE TABLE IF NOT EXISTS users (name TEXT, age INTEGER)&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;insert&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prepare&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;INSERT INTO users (name, age) VALUES (?, ?)&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;insert&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;John&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;25&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;prepare&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;SELECT * FROM users WHERE name = ?&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;).&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;John&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nx&#34;&gt;console&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;log&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;user&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;// { name: &amp;#39;John&amp;#39;, age: 25 }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Si le fichier n&amp;rsquo;existe pas, &lt;code&gt;better-sqlite3&lt;/code&gt; le &lt;strong&gt;créera automatiquement pour vous&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;sqlite-prend-en-charge-une-syntaxe-sql-plus-puissante-que-vous-ne-le-pensez&#34;&gt;SQLite prend en charge une syntaxe SQL plus puissante que vous ne le pensez
&lt;/h2&gt;&lt;p&gt;Beaucoup de gens pensent que &lt;code&gt;SQLite&lt;/code&gt; est très basique, mais il prend en charge la grande majorité de la syntaxe SQL standard, y compris de nombreuses fonctionnalités avancées :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Catégorie de syntaxe&lt;/th&gt;
          &lt;th&gt;Éléments pris en charge&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Opérations de base&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Définition des données&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;CREATE TABLE&lt;/code&gt;, &lt;code&gt;CREATE INDEX&lt;/code&gt;, &lt;code&gt;CREATE VIEW&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Requêtes avancées&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;WITH&lt;/code&gt; (CTEs récursives), Fonctions de fenêtre (Window Functions)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Gestion des conflits&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;UPSERT&lt;/code&gt; (&lt;code&gt;INSERT ... ON CONFLICT DO UPDATE&lt;/code&gt;)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Traitement du JSON&lt;/td&gt;
          &lt;td&gt;Fonctions intégrées comme &lt;code&gt;json_extract&lt;/code&gt;, &lt;code&gt;json_array&lt;/code&gt;, &lt;code&gt;json_object&lt;/code&gt;, etc.&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Contrôle des transactions&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;BEGIN&lt;/code&gt;, &lt;code&gt;COMMIT&lt;/code&gt;, &lt;code&gt;ROLLBACK&lt;/code&gt;, &lt;code&gt;SAVEPOINT&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Requêtes de jointure&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;INNER JOIN&lt;/code&gt;, &lt;code&gt;LEFT JOIN&lt;/code&gt;, &lt;code&gt;RIGHT JOIN&lt;/code&gt; et &lt;code&gt;FULL OUTER JOIN&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;La philosophie centrale de SQLite est &amp;ldquo;petit et beau&amp;rdquo;&lt;/strong&gt;, prenant en charge la plupart des capacités SQL dont vous avez besoin au quotidien tout en restant extrêmement léger.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;où-sont-les-limites-de-sqlite-&#34;&gt;Où sont les limites de SQLite ?
&lt;/h2&gt;&lt;p&gt;La légèreté a un prix. Si l&amp;rsquo;on compare &lt;code&gt;SQLite&lt;/code&gt; à une &lt;strong&gt;épicerie hipster avec une seule caisse&lt;/strong&gt;, alors &lt;code&gt;PostgreSQL&lt;/code&gt; est un &lt;strong&gt;Costco équipé de 50 caisses&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;1-embouteillage-décriture&#34;&gt;1. Embouteillage d&amp;rsquo;écriture
&lt;/h3&gt;&lt;p&gt;Lorsque &lt;code&gt;SQLite&lt;/code&gt; écrit des données, il &lt;strong&gt;verrouille&lt;/strong&gt; l&amp;rsquo;intégralité du fichier de base de données.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imaginez un &lt;strong&gt;restaurant avec une seule toilette&lt;/strong&gt; : 100 personnes peuvent regarder le menu à l&amp;rsquo;extérieur (lire) en même temps, mais tant qu&amp;rsquo;une personne y entre et verrouille la porte (écrire), toutes les autres ne peuvent que faire la queue et attendre.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bien que l&amp;rsquo;activation du &lt;strong&gt;mode WAL (Write-Ahead Logging)&lt;/strong&gt; puisse améliorer les performances de lecture/écriture simultanées, il reste fondamentalement impossible d&amp;rsquo;effectuer des écritures simultanées multi-thread sur différentes lignes de données.&lt;/p&gt;
&lt;h3 id=&#34;2-impossible-de-sétendre-sur-plusieurs-serveurs&#34;&gt;2. Impossible de s&amp;rsquo;étendre sur plusieurs serveurs
&lt;/h3&gt;&lt;p&gt;L&amp;rsquo;essence de &lt;code&gt;SQLite&lt;/code&gt; est un fichier physique. Si votre système est déployé sur plusieurs serveurs (mise à l&amp;rsquo;échelle horizontale), ces serveurs &lt;strong&gt;ne peuvent pas partager le même fichier en toute sécurité&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;3-manque-de-gestion-des-permissions-détaillée&#34;&gt;3. Manque de gestion des permissions détaillée
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;SQLite&lt;/code&gt; n&amp;rsquo;a pas de concept de &amp;ldquo;comptes d&amp;rsquo;utilisateurs&amp;rdquo;. Quiconque peut lire ce fichier &lt;code&gt;.db&lt;/code&gt; au niveau du système d&amp;rsquo;exploitation peut voir et modifier toutes les données.&lt;/p&gt;
&lt;p&gt;Pour les &lt;strong&gt;systèmes d&amp;rsquo;entreprise qui nécessitent des audits stricts des données personnelles&lt;/strong&gt;, c&amp;rsquo;est inacceptable.&lt;/p&gt;
&lt;h2 id=&#34;sqlite-vs-postgresql--décisions-de-sélection-technologique&#34;&gt;SQLite vs. PostgreSQL : Décisions de sélection technologique
&lt;/h2&gt;&lt;p&gt;Les outils ne sont ni bons ni mauvais, ils sont seulement adaptés ou non. Voici une liste de contrôle ultime pour vous aider à prendre une décision :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Question&lt;/th&gt;
          &lt;th&gt;Réponse &amp;ldquo;Oui&amp;rdquo; → Choisissez SQLite&lt;/th&gt;
          &lt;th&gt;Réponse &amp;ldquo;Non&amp;rdquo; → Choisissez PostgreSQL&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Y a-t-il un seul serveur backend, ou s&amp;rsquo;exécute-t-il entièrement en local ?&lt;/td&gt;
          &lt;td&gt;Oui&lt;/td&gt;
          &lt;td&gt;Non (requiert une mise à l&amp;rsquo;échelle horizontale, plusieurs machines)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Le comportement du système est-il dominé par la lecture, sans écritures simultanées fréquentes ?&lt;/td&gt;
          &lt;td&gt;Oui&lt;/td&gt;
          &lt;td&gt;Non (les utilisateurs se disputeront l&amp;rsquo;écriture simultanée)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Pas besoin de permissions de compte de base de données détaillées ni d&amp;rsquo;indexation avancée ?&lt;/td&gt;
          &lt;td&gt;Oui&lt;/td&gt;
          &lt;td&gt;Non (dépend fortement de fonctionnalités avancées)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Comparations de scénarios plus spécifiques :&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Scénario&lt;/th&gt;
          &lt;th&gt;Sélection recommandée&lt;/th&gt;
          &lt;th&gt;Raison&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Logiciels de bureau, Applications mobiles, Appareils IoT&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Les données voyagent avec l&amp;rsquo;appareil, pas d&amp;rsquo;installation&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Blogs personnels, Sites vitrines&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Beaucoup de lecture, peu d&amp;rsquo;écriture, économise les coûts du serveur&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Développement rapide de prototypes, Demos&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Créez simplement un fichier pour commencer&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Forums communautaires, Plateformes d&amp;rsquo;e-commerce&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Forte simultanéité d&amp;rsquo;écriture, requiert un verrouillage au niveau de la ligne&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Déploiement distribué sur plusieurs serveurs&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Nécessité de partager la source de données entre différentes machines&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Systèmes sensibles comme le médical ou la finance&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Requiert un contrôle strict des permissions basé sur les rôles&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;votre-base-de-données-est-elle-un-bloc-notes-de-poche-ou-un-standard-téléphonique-central-&#34;&gt;Votre base de données est-elle un bloc-notes de poche ou un standard téléphonique central ?
&lt;/h2&gt;&lt;p&gt;Si les données sont de type &lt;strong&gt;&amp;ldquo;monoposte, statiques, propriétaire unique&amp;rdquo;&lt;/strong&gt;, choisissez &lt;code&gt;SQLite&lt;/code&gt; pour profiter d&amp;rsquo;une légèreté et d&amp;rsquo;une liberté extrêmes ;&lt;/p&gt;
&lt;p&gt;Si les données sont de type &lt;strong&gt;&amp;ldquo;cloud, dynamiques, hautement interactives&amp;rdquo;&lt;/strong&gt;, laissez &lt;code&gt;PostgreSQL&lt;/code&gt; prendre le relais.&lt;/p&gt;
&lt;p&gt;La philosophie centrale de &lt;code&gt;SQLite&lt;/code&gt; est &lt;strong&gt;&amp;ldquo;un composant interne de l&amp;rsquo;application&amp;rdquo;&lt;/strong&gt;, tandis que &lt;code&gt;PostgreSQL&lt;/code&gt; est positionné comme &lt;strong&gt;&amp;ldquo;un centre indépendant de l&amp;rsquo;architecture du système&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;La prochaine fois que vous prendrez une décision d&amp;rsquo;architecture, ne vous précipitez pas pour sortir &lt;code&gt;PostgreSQL&lt;/code&gt;. Demandez-vous d&amp;rsquo;abord :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;Ma base de données est-elle un bloc-notes de poche, ou un standard téléphonique central ?&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Une fois la réponse claire, le choix s&amp;rsquo;impose naturellement.&lt;/p&gt;
&lt;h2 id=&#34;reference&#34;&gt;Reference
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://sqlite.org/lang.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Query Language Understood by SQLite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://sqlite.org/docs.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SQLite Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://www.sqlitetutorial.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SQLite Tutorial - An Easy Way to Master SQLite Fast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://en.wikipedia.org/wiki/SQLite&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;SQLite - Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        
    </channel>
</rss>
