<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>SQLite on Dev TLDRLSS</title>
        <link>https://dev.tldrlss.com/pt/tags/sqlite/</link>
        <description>Recent content in SQLite on Dev TLDRLSS</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>pt</language>
        <lastBuildDate>Tue, 19 May 2026 18:10:00 +0800</lastBuildDate><atom:link href="https://dev.tldrlss.com/pt/tags/sqlite/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>Não se deixe enganar pela informalidade do SQLite! Quais são as armadilhas dos tipos dinâmicos? Por que o ALTER TABLE é capenga? Como construir uma arquitetura de programação defensiva no Node.js para atualizações de esquema sem dor?</title>
        <link>https://dev.tldrlss.com/pt/article/2026/05/sqlite-pitfall-intro/</link>
        <pubDate>Tue, 19 May 2026 18:10:00 +0800</pubDate>
        
        <guid>https://dev.tldrlss.com/pt/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 Não se deixe enganar pela informalidade do SQLite! Quais são as armadilhas dos tipos dinâmicos? Por que o ALTER TABLE é capenga? Como construir uma arquitetura de programação defensiva no Node.js para atualizações de esquema sem dor?" /&gt;&lt;p&gt;Imagine uma lixeira de reciclagem onde você claramente colocou uma etiqueta dizendo &amp;quot;Apenas Garrafas Plásticas&amp;quot;, mas quando alguém joga um pedaço de papel lá dentro, ela o aceita silenciosamente sem uma única palavra de protesto?&lt;/p&gt;
&lt;p&gt;Esta é a experiência de arrepiar a espinha que os desenvolvedores vivem quando conhecem o sistema de tipos do &lt;code&gt;SQLite&lt;/code&gt; pela primeira vez.&lt;/p&gt;
&lt;p&gt;Se você está acostumado ao estilo rigoroso de agente de alfândega do &lt;code&gt;PostgreSQL&lt;/code&gt; (onde os tipos incorretos são rejeitados diretamente), a informalidade do &lt;code&gt;SQLite&lt;/code&gt; pode fazer você questionar sua vida.&lt;/p&gt;
&lt;p&gt;Ainda mais assustador, quando você quer &lt;strong&gt;modificar a estrutura de uma tabela&lt;/strong&gt;, ele lhe dirá:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;quot;A tabela não pode ser modificada diretamente. Por favor, construa uma casa nova, mude os móveis e depois exploda a casa velha.&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;sob-o-capô-o-sqlite-tem-apenas-5-classes-de-armazenamento&#34;&gt;Sob o capô, o SQLite tem apenas 5 classes de armazenamento
&lt;/h2&gt;&lt;p&gt;Não importa quais nomes de tipo elegantes você declare em &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;), o &lt;code&gt;SQLite&lt;/code&gt; sob o capô reconhece apenas estas &lt;strong&gt;5 classes de armazenamento&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Classe de armazenamento&lt;/th&gt;
          &lt;th&gt;Descrição&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;Valor nulo&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;Inteiro (ocupa automaticamente de 1 a 8 bytes de acordo com a magnitude)&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;Número de ponto flutuante (fixo de 8 bytes)&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;String de texto (codificação UTF-8 padrão)&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;Objeto binário grande (armazenado exatamente como inserido)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Os tipos que você define nas colunas &lt;strong&gt;são meramente &amp;quot;sugestões&amp;quot; para o &lt;code&gt;SQLite&lt;/code&gt;, não &amp;quot;regras obrigatórias&amp;quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Isso se chama &lt;strong&gt;&amp;quot;Type Affinity&amp;quot; (Afinidade de tipos)&lt;/strong&gt;. O &lt;code&gt;SQLite&lt;/code&gt; tentará converter seus dados para o tipo sugerido, mas se não puder, simplesmente colocará os dados originais de qualquer maneira sem lançar nenhum erro.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Você pode declarar uma coluna &lt;code&gt;age INTEGER&lt;/code&gt; no &lt;code&gt;SQLite&lt;/code&gt; e depois inserir a string &lt;code&gt;&#39;para sempre dezoito&#39;&lt;/code&gt;; ele o aceitará com prazer.&lt;/p&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;três-armadilhas-de-tipos-mais-fáceis-de-cair&#34;&gt;Três armadilhas de tipos mais fáceis de cair
&lt;/h2&gt;&lt;h3 id=&#34;armadilha-1-sem-boolean-nativo&#34;&gt;Armadilha 1: Sem Boolean nativo
&lt;/h3&gt;&lt;p&gt;O &lt;code&gt;SQLite&lt;/code&gt; &lt;strong&gt;não tem tipo booleano&lt;/strong&gt;. &lt;code&gt;True&lt;/code&gt; e &lt;code&gt;False&lt;/code&gt; só podem ser representados pelos inteiros &lt;code&gt;1&lt;/code&gt; e &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Quando você recupera dados do &lt;code&gt;SQLite&lt;/code&gt; usando &lt;code&gt;Node.js&lt;/code&gt;, obterá o número &lt;code&gt;1&lt;/code&gt; ou &lt;code&gt;0&lt;/code&gt;, não &lt;code&gt;true&lt;/code&gt; ou &lt;code&gt;false&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Se você realizar diretamente uma verificação como &lt;code&gt;if (user.is_admin === true)&lt;/code&gt;, isso nunca será verdadeiro.&lt;/p&gt;
&lt;h3 id=&#34;armadilha-2-sem-tipo-datetime&#34;&gt;Armadilha 2: Sem tipo Date/Time
&lt;/h3&gt;&lt;p&gt;O &lt;code&gt;SQLite&lt;/code&gt; &lt;strong&gt;não tem tipo de data/hora&lt;/strong&gt;. Você só pode armazenar o tempo como:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Método de armazenamento&lt;/th&gt;
          &lt;th&gt;Exemplo&lt;/th&gt;
          &lt;th&gt;Prós e contras&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;TEXT (string 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;Mais recomendado&lt;/strong&gt;, alta legibilidade, conversão perfeita ao passar para PostgreSQL no futuro&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;Pegada pequena, mas não legível por humanos&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Nunca armazene datas em formatos personalizados arbitrários como &lt;code&gt;19/05/2026 18:00&lt;/code&gt;, caso contrário, a migração de dados no futuro será un desastre.&lt;/p&gt;
&lt;h3 id=&#34;armadilha-3-inserir-uma-string-em-uma-coluna-integer-não-gerará-erro&#34;&gt;Armadilha 3: Inserir uma string em uma coluna Integer não gerará erro
&lt;/h3&gt;&lt;p&gt;No &lt;code&gt;PostgreSQL&lt;/code&gt;, inserir uma string em uma coluna &lt;code&gt;INTEGER&lt;/code&gt; gera um erro imediatamente. Mas o &lt;code&gt;SQLite&lt;/code&gt; apenas tentará convertê-la silenciosamente e, se falhar, a aceitará tal como está.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Isso significa que &lt;strong&gt;dados sujos podem entrar silenciosamente no seu banco de dados&lt;/strong&gt; até que um dia seu programa falhe devido ao recebimento de um tipo inesperado, só então você descobrirá o problema.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;programação-defensiva-tratar-um-banco-de-dados-informal-com-uma-atitude-rigorosa&#34;&gt;Programação defensiva: Tratar um banco de dados informal com uma atitude rigorosa
&lt;/h2&gt;&lt;p&gt;Diante da informalidade do &lt;code&gt;SQLite&lt;/code&gt;, você deve construir &lt;strong&gt;mecanismos de defesa rígidos&lt;/strong&gt; no desenvolvimento com &lt;code&gt;Node.js&lt;/code&gt;:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Nível de defesa&lt;/th&gt;
          &lt;th&gt;Ferramenta&lt;/th&gt;
          &lt;th&gt;Papel&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Guarda em tempo de compilação&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;TypeScript&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Capturar tipos incorretos no estágio de escrita do código&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Validação de entrada de API&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Zod&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Validar os dados de entrada estritamente (garantir que age seja sempre um número)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Conversão implícita de tipos&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Prisma / Drizzle ORM&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Lidar automaticamente com as diferenças de tipos entre SQLite e PostgreSQL&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Mover o &lt;strong&gt;&amp;quot;guardião da validação de dados&amp;quot;&lt;/strong&gt; da camada do banco de dados para a camada da aplicação &lt;code&gt;Node.js&lt;/code&gt; é uma estratégia-chave para aproveitar a velocidade de desenvolvimento do SQLite e, ao mesmo tempo, garantir a escalabilidade futura.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ao usar um ORM, desde que você declare &lt;code&gt;type: &#39;boolean&#39;&lt;/code&gt; no seu código, o ORM o converte automaticamente para &lt;code&gt;1/0&lt;/code&gt; ao salvar no &lt;code&gt;SQLite&lt;/code&gt;, e o converte de volta para &lt;code&gt;true/false&lt;/code&gt; ao ler, ocultando perfeitamente as diferenças de tipos subjacentes.&lt;/p&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;alter-table-é-capenga-o-que-pode-e-o-que-não-pode-ser-modificado&#34;&gt;ALTER TABLE é capenga: O que pode e o que não pode ser modificado
&lt;/h2&gt;&lt;p&gt;O suporte do &lt;code&gt;SQLite&lt;/code&gt; para modificar estruturas de tabelas é muito limitado:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Operação&lt;/th&gt;
          &lt;th&gt;Suportado&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Adicionar coluna (&lt;code&gt;ADD COLUMN&lt;/code&gt;)&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Sim&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Renomear coluna (&lt;code&gt;RENAME COLUMN&lt;/code&gt;)&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Sim&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Excluir coluna (&lt;code&gt;DROP COLUMN&lt;/code&gt;)&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Sim&lt;/strong&gt; (em versões mais novas)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Renomear tabela (&lt;code&gt;RENAME TO&lt;/code&gt;)&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Sim&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Alterar tipo de coluna&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Não&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Adicionar/remover restrições &lt;code&gt;UNIQUE&lt;/code&gt;, &lt;code&gt;NOT NULL&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Não&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Modificar chave primária&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Não&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Modificar chave estrangeira&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Não&lt;/strong&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;Uma vez que precise realizar qualquer uma das modificações &amp;quot;não suportadas&amp;quot;, o &lt;code&gt;SQLite&lt;/code&gt; exige que você execute a estratégia de &lt;strong&gt;&amp;quot;recriar e mover&amp;quot;&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;os-quatro-passos-para-recriar-e-mover-o-caminho-de-atualização-de-tabelas-do-sqlite&#34;&gt;Os quatro passos para recriar e mover: O caminho de atualização de tabelas do SQLite
&lt;/h2&gt;&lt;p&gt;Como não pode ser modificado diretamente, a prática padrão recomendada pelos documentos oficiais é &lt;strong&gt;construir uma casa nova, mudar os móveis, explodir a casa velha e colocar a placa nova&lt;/strong&gt;:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Passo&lt;/th&gt;
          &lt;th&gt;Ação&lt;/th&gt;
          &lt;th&gt;Descrição&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;Criar tabela nova&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;CREATE TABLE users_new (...)&lt;/code&gt; usando a estrutura correta&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;Copiar dados&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;Excluir tabela velha&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;Renombrar tabela&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;Esses quatro passos devem ser executados &lt;strong&gt;de uma só vez&lt;/strong&gt;; qualquer queda de energia ou crash da aplicação no meio do caminho resultará na perda de dados.&lt;/p&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;garantir-que-as-atualizações-não-percam-dados-duas-linhas-de-defesa-de-segurança&#34;&gt;Garantir que as atualizações não percam dados: Duas linhas de defesa de segurança
&lt;/h2&gt;&lt;h3 id=&#34;linha-de-defesa-1-defesa-física-copiar-o-arquivo-diretamente&#34;&gt;Linha de defesa 1: Defesa física, copiar o arquivo diretamente
&lt;/h3&gt;&lt;p&gt;O &lt;code&gt;SQLite&lt;/code&gt; é essencialmente apenas um arquivo. Antes de executar qualquer alteração de esquema, simplesmente faça uma cópia do arquivo &lt;code&gt;.db&lt;/code&gt; como backup.&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;Se as coisas derem errado, substituir o arquivo restaura tudo em un instante. Esta é uma vantagem que outros bancos de dados grandes não podem oferecer.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;linha-de-defesa-2-pacote-de-transaction-a-máquina-do-tempo-do-banco-de-dados&#34;&gt;Linha de defesa 2: Pacote de Transaction, a máquina do tempo do banco de dados
&lt;/h3&gt;&lt;p&gt;Envolva todos os passos de migração dentro de uma única &lt;code&gt;Transaction&lt;/code&gt;; se algum passo falhar, todo o processo será &lt;strong&gt;revertido automaticamente (Rollback)&lt;/strong&gt; como se nada tivesse acontecido.&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;Tabela atualizada com sucesso&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;A atualização falhou, dados restaurados com segurança:&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;Arquivo de backup + Vinculação de Transaction&amp;quot;&lt;/strong&gt; é o airbag da migração do seu banco de dados.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;controle-a-informalidade-do-sqlite-com-uma-atitude-rigorosa&#34;&gt;Controle a informalidade do SQLite com uma atitude rigorosa
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Domine a informalidade do &lt;code&gt;SQLite&lt;/code&gt; com uma &lt;strong&gt;arquitetura rígida na camada de aplicação&lt;/strong&gt; para desfrutar da sua velocidade de desenvolvimento ultrarrápida e evitar dívidas técnicas futuras.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;O sistema de tipos do SQLite é muito informal, e o &lt;code&gt;ALTER TABLE&lt;/code&gt; tem muitas limitações.&lt;/p&gt;
&lt;p&gt;No entanto, desde que você realize &lt;strong&gt;verificação de tipos com TypeScript + validação com Zod + abstração com ORM&lt;/strong&gt; no lado do &lt;code&gt;Node.js&lt;/code&gt;, combinado com a estratégia de segurança de &lt;strong&gt;backup físico + Transaction&lt;/strong&gt;, você dapat desfrutar com segurança da eficiência de desenvolvimento oferecida pelo &lt;code&gt;SQLite&lt;/code&gt; enquanto pavimenta o caminho para migrar para o &lt;code&gt;PostgreSQL&lt;/code&gt; no futuro.&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ão use o PostgreSQL para tudo! Quais são as vantagens da arquitetura embarcada e configuração zero do SQLite? Onde estão os limites do SQLite? Quando você deve escolher o SQLite e quando o PostgreSQL?</title>
        <link>https://dev.tldrlss.com/pt/article/2026/05/sqlite-intro/</link>
        <pubDate>Tue, 19 May 2026 18:00:00 +0800</pubDate>
        
        <guid>https://dev.tldrlss.com/pt/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ão use o PostgreSQL para tudo! Quais são as vantagens da arquitetura embarcada e configuração zero do SQLite? Onde estão os limites do SQLite? Quando você deve escolher o SQLite e quando o PostgreSQL?" /&gt;&lt;p&gt;Você já pensou no fato de que o navegador que você abre todos os dias, o software de comunicação no seu celular e até a ferramenta de notas no seu computador ocultam o mesmo banco de dados leve?&lt;/p&gt;
&lt;p&gt;Ele não exige que você instale nenhum software de servidor, não precisa de configurações de conta ou senha e nem precisa de conexão com a Internet. É simplesmente um &lt;strong&gt;arquivo&lt;/strong&gt;, que repousa silenciosamente no seu disco rígido, pronto para atendê-lo a qualquer momento.&lt;/p&gt;
&lt;p&gt;Essa existência discreta é o &lt;code&gt;SQLite&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;o-que-é-o-sqlite-o-banco-de-dados-mais-amplamente-implantado-no-mundo&#34;&gt;O que é o SQLite? O banco de dados mais amplamente implantado no mundo
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;SQLite&lt;/code&gt; é um &lt;strong&gt;mecanismo de banco de dados relacional embarcado&lt;/strong&gt; escrito em C.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ele &lt;strong&gt;não possui um processo de servidor independente&lt;/strong&gt;, mas é diretamente embarcado em sua aplicação para ser executado.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Isso é completamente diferente do &lt;code&gt;PostgreSQL&lt;/code&gt; ou &lt;code&gt;MySQL&lt;/code&gt; com os quais você está familiarizado. Os bancos de dados tradicionais são &lt;strong&gt;servidores independentes&lt;/strong&gt; executados separadamente, e seu programa deve &amp;ldquo;comunicar-se&amp;rdquo; com eles por meio de um &lt;strong&gt;protocolo de rede (TCP/IP)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;But &lt;code&gt;SQLite&lt;/code&gt; é diferente; é simplesmente um bloco de código que roda diretamente dentro da sua aplicação, lendo e gravando aquele arquivo &lt;code&gt;.db&lt;/code&gt; no seu disco rígido.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Dimensão de comparação&lt;/th&gt;
          &lt;th&gt;SQLite (Embarcado)&lt;/th&gt;
          &lt;th&gt;PostgreSQL (Cliente-Servidor)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Modo de operação&lt;/td&gt;
          &lt;td&gt;Diretamente embarcado na aplicação, sem servidor independente&lt;/td&gt;
          &lt;td&gt;Processo de servidor independente, via conexão de rede&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Requisitos de config.&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Configuração zero&lt;/strong&gt;, sem instalação, sem credenciais&lt;/td&gt;
          &lt;td&gt;Requer instalação, configuração de conta/senha e firewall&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Armaz. de dados&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Arquivo único multiplataforma&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Múltiplos arquivos sob o diretório do servidor&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Método de backup&lt;/td&gt;
          &lt;td&gt;Copiar diretamente aquele arquivo&lt;/td&gt;
          &lt;td&gt;Requer ferramentas dedicadas como pg_dump&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;É precisamente por causa dessa característica de &lt;strong&gt;&amp;ldquo;plug-and-play&amp;rdquo;&lt;/strong&gt; que o &lt;code&gt;SQLite&lt;/code&gt; se tornou o mecanismo de banco de dados mais implantado no mundo.&lt;/p&gt;
&lt;p&gt;Desde os sistemas operacionais Android e iOS, navegadores Chrome e Firefox, até o Adobe Lightroom, WhatsApp e até mesmo o sistema de voo do Airbus A350, ele está em toda parte.&lt;/p&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;usando-o-sqlite-no-nodejs&#34;&gt;Usando o SQLite no Node.js
&lt;/h2&gt;&lt;p&gt;Se você é um desenvolvedor Node.js, usar o &lt;code&gt;SQLite&lt;/code&gt; é extremamente simples. Você não precisa instalar nenhum software de servidor de banco de dados no seu computador, precisa apenas instalar um pacote npm para começar.&lt;/p&gt;
&lt;p&gt;As opções mais comumente usadas na indústria hoje:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Nome do pacote&lt;/th&gt;
          &lt;th&gt;Características&lt;/th&gt;
          &lt;th&gt;Cenário recomendado&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;O mais tradicional, suporta APIs assíncronas&lt;/td&gt;
          &lt;td&gt;Quando precisa lidar com muitas tarefas assíncronas simultaneamente&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;Excelente desempenho&lt;/strong&gt;, design de API intuitivo, extremamente rápido&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Recomendação principal&lt;/strong&gt;, para eficiência de desenvolvimento e velocidade de execução&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Criar um banco de dados e consultá-lo com o &lt;code&gt;better-sqlite3&lt;/code&gt; leva menos de cinco minutos:&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;Se o arquivo não existir, o &lt;code&gt;better-sqlite3&lt;/code&gt; o &lt;strong&gt;criará automaticamente para você&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;o-sqlite-suporta-uma-sintaxe-sql-mais-poderosa-do-que-você-imagina&#34;&gt;O SQLite suporta uma sintaxe SQL mais poderosa do que você imagina
&lt;/h2&gt;&lt;p&gt;Muitas pessoas pensam que o &lt;code&gt;SQLite&lt;/code&gt; é muito básico, mas ele suporta a grande maioria da sintaxe SQL padrão, incluindo muitos recursos avançados:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Categoria de sintaxe&lt;/th&gt;
          &lt;th&gt;Itens suportados&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Operações básicas&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;Definição de dados&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;Consultas avançadas&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;WITH&lt;/code&gt; (CTEs recursivas), Funções de janela (Window Functions)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Tratamento de conflito&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;Processamento de JSON&lt;/td&gt;
          &lt;td&gt;Funções integradas como &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;Controle de transação&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;Consultas de junção&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; e &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;A filosofia central do SQLite é &amp;ldquo;pequeno e bonito&amp;rdquo;&lt;/strong&gt;, suportando a maioria das capacidades SQL que você precisa no dia a dia, mantendo-se extremamente leve.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;onde-estão-os-limites-do-sqlite&#34;&gt;Onde estão os limites do SQLite?
&lt;/h2&gt;&lt;p&gt;A leveza tem um preço. Se compararmos o &lt;code&gt;SQLite&lt;/code&gt; a uma &lt;strong&gt;mercearia hipster com apenas um caixa de pagamento&lt;/strong&gt;, o &lt;code&gt;PostgreSQL&lt;/code&gt; seria um &lt;strong&gt;Costco equipado com 50 caixas registradoras&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;1-congestionamento-de-gravação&#34;&gt;1. Congestionamento de gravação
&lt;/h3&gt;&lt;p&gt;Quando o &lt;code&gt;SQLite&lt;/code&gt; grava dados, ele &lt;strong&gt;bloqueia&lt;/strong&gt; todo o arquivo do banco de dados.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Imagine um &lt;strong&gt;restaurante com apenas um banheiro&lt;/strong&gt;: 100 pessoas podem olhar o cardápio do lado de fora (ler) ao mesmo tempo, mas contanto que 1 pessoa entre e tranque a porta (gravar), todas as outras só podem fazer fila e esperar.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Embora a ativação do &lt;strong&gt;modo WAL (Write-Ahead Logging)&lt;/strong&gt; possa melhorar o desempenho de leitura/gravação simultânea, fundamentalmente ainda não é possível realizar gravações simultâneas multithread em diferentes linhas de dados.&lt;/p&gt;
&lt;h3 id=&#34;2-não-é-possível-distribuir-em-múltiplos-servidores&#34;&gt;2. Não é possível distribuir em múltiplos servidores
&lt;/h3&gt;&lt;p&gt;A essência do &lt;code&gt;SQLite&lt;/code&gt; é um arquivo físico. Se o seu sistema for implantado em múltiplos servidores (escala horizontal), esses servidores &lt;strong&gt;não podem compartilhar o mesmo arquivo com segurança&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;3-falta-de-gerenciamento-de-permissões-detalhado&#34;&gt;3. Falta de gerenciamento de permissões detalhado
&lt;/h3&gt;&lt;p&gt;O &lt;code&gt;SQLite&lt;/code&gt; não possui o conceito de &amp;ldquo;contas de usuário&amp;rdquo;. Qualquer pessoa que possa ler esse arquivo &lt;code&gt;.db&lt;/code&gt; no nível do sistema operacional pode ver e modificar todos os dados.&lt;/p&gt;
&lt;p&gt;Para &lt;strong&gt;sistemas de negócios que exigem auditorias rigorosas de dados pessoais&lt;/strong&gt;, isso é inaceitável.&lt;/p&gt;
&lt;h2 id=&#34;sqlite-vs-postgresql-decisões-de-seleção-de-tecnologia&#34;&gt;SQLite vs. PostgreSQL: Decisões de seleção de tecnologia
&lt;/h2&gt;&lt;p&gt;As ferramentas não são boas nem ruins, apenas adequadas ou não. Aqui está um checklist definitivo para ajudá-lo a tomar decisões:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Pergunta&lt;/th&gt;
          &lt;th&gt;Resposta &amp;ldquo;Sim&amp;rdquo; → Escolha o SQLite&lt;/th&gt;
          &lt;th&gt;Resposta &amp;ldquo;Não&amp;rdquo; → Escolha o PostgreSQL&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Existe apenas um servidor backend, ou ele roda totalmente de forma local?&lt;/td&gt;
          &lt;td&gt;Sim&lt;/td&gt;
          &lt;td&gt;Não (requer escala horizontal, múltiplas máquinas)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;O comportamento do sistema é dominado pela leitura, sem gravações simultâneas de alta frequência?&lt;/td&gt;
          &lt;td&gt;Sim&lt;/td&gt;
          &lt;td&gt;Não (os usuários competirão para gravar simultaneamente)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Não precisa de permissões de conta de banco de dados detalhadas ou indexação avançada?&lt;/td&gt;
          &lt;td&gt;Sim&lt;/td&gt;
          &lt;td&gt;Não (depende fortemente de recursos avançados)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Comparações de cenários mais específicos:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Cenário&lt;/th&gt;
          &lt;th&gt;Seleção recomendada&lt;/th&gt;
          &lt;th&gt;Razão&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Software desktop, Aplicativos móveis, Dispositivos IoT&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Os dados viajam com o dispositivo, sem instalação&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Blogs pessoais, Sites de portfólio/institucionais&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Muita leitura, pouca gravação, economiza custos de manutenção de servidor&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Desenvolvimento rápido de protótipos, Demos&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;SQLite&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Basta criar um arquivo para começar&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Fóruns comunitários, Plataformas de comércio eletrônico&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Alta concorrência de gravação, requer bloqueio a nível de linha&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Implantação distribuída em múltiplos servidores&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Precisa compartilhar a fonte de dados entre diferentes máquinas&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Sistemas sensíveis como médicos ou financeiros&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
          &lt;td&gt;Requer controle estrito de permissões baseado em funções&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;!--adsense--&gt;
&lt;h2 id=&#34;o-seu-banco-de-dados-é-um-bloco-de-notas-de-bolso-ou-uma-central-telefônica-central&#34;&gt;O seu banco de dados é um bloco de notas de bolso ou uma central telefônica central?
&lt;/h2&gt;&lt;p&gt;Se os dados são &lt;strong&gt;&amp;ldquo;monomáquina, estáticos, de proprietário único&amp;rdquo;&lt;/strong&gt;, escolha o &lt;code&gt;SQLite&lt;/code&gt; para desfrutar de extrema leveza e liberdade;&lt;/p&gt;
&lt;p&gt;Se os dados são &lt;strong&gt;&amp;ldquo;na nuvem, dinâmicos, altamente interativos&amp;rdquo;&lt;/strong&gt;, deixe o &lt;code&gt;PostgreSQL&lt;/code&gt; assumir o controle.&lt;/p&gt;
&lt;p&gt;A filosofia central do &lt;code&gt;SQLite&lt;/code&gt; é &lt;strong&gt;&amp;ldquo;um componente interno da aplicação&amp;rdquo;&lt;/strong&gt;, enquanto o &lt;code&gt;PostgreSQL&lt;/code&gt; se posiciona como &lt;strong&gt;&amp;ldquo;um centro independente da arquitetura do sistema&amp;rdquo;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;A próxima vez que tomar uma decisão de arquitetura, não se apresse em sacar o &lt;code&gt;PostgreSQL&lt;/code&gt;. Pergunte-se primeiro:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&amp;ldquo;O meu banco de dados é um bloco de notas de bolso ou uma central telefônica central?&amp;rdquo;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Quando a resposta estiver clara, a escolha naturalmente se tornará óbvia.&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>
