![](https://optimuscloud.com.br/wp-content/uploads/2024/05/1716403444_459_Drizzle-ORM-e-SQL-em-um-chapeu-JavaScript-–-e.jpg)
Paul é engenheiro de software sênior, defensor independente do desenvolvedor e redator técnico. Mais informações de Paul podem ser encontradas em seu site, paulie.dev.
Leia mais de Paul Scanlon
Drizzle ORM é descrito por seus criadores como “um TypeScript ORM sem cabeça e com cabeça”. Mas o que é um ORM? A abreviatura ORM é a abreviatura de “mapeamento objeto-relacional”, que é uma técnica de programação usada para converter dados entre sistemas de tipos incompatíveis. No caso do Drizzle ORM, isso significa converter tipos de SQL para TypeScript.
Neste artigo, discutirei a abordagem do Drizzle ORM para SQL e por que considero que é uma excelente solução para desenvolvedores que trabalham com bancos de dados relacionais em ambientes TypeScript.
No mundo do JavaScript, um ORM permite que os desenvolvedores interajam com um banco de dados relacional usando sintaxe baseada em método, em vez de usar consultas SQL brutas. Muitos desenvolvedores de JavaScript evitam o SQL, alegando que ele não é seguro para o tipo.
Afirmar que o SQL não é seguro é como carregar um balde de areia no oceano e depois reclamar que não é possível construir um castelo com ele.
Mas SQL é uma linguagem digitada e, portanto, é de tipo seguro. Ao criar esquema para tabelas no PostgreSQL, você define cada coluna e atribui a ela um tipo de dados. Por exemplo:
Os desenvolvedores que afirmam que o SQL não tem tipo seguro significam que os tipos SQL não funcionam quando o SQL é movido do ambiente pretendido e para um ambiente diferente — por exemplo, um ambiente TypeScript.
Mas não é responsabilidade do SQL garantir que seu sistema de tipos funcione em seu ambiente — ele é seu. Afirmar que o SQL não é seguro é como carregar um balde de areia no oceano e depois reclamar que não é possível construir um castelo com ele.
Nesses casos, um ORM pode ajudar a preservar a segurança de tipo pretendida de uma linguagem, ao mesmo tempo que transfere os mesmos tipos para o novo ambiente.
Ao aprender Drizzle ORM, você está realmente aprendendo SQL – basta expressá-lo usando sintaxe baseada em método.
Ao contrário de alguns clientes e SDKs ORMs e JavaScript, que tendem a reinventar a roda introduzindo uma sintaxe muito específica (que geralmente funciona apenas naquele cenário), Drizzle ORM pretende ser o mais semelhante ao SQL possível – e como você provavelmente já saiba, o SQL está absolutamente em todo lugar!
Ao aprender Drizzle ORM, você está realmente aprendendo SQL – basta expressá-lo usando sintaxe baseada em método.
Aqui está o mesmo esquema de tabela acima, mas desta vez escrito em JavaScript:
Parece muito parecido, certo? Para mim, este é um passo na direção certa e ajuda a explicar por que acho que o Drizzle ORM é uma boa alternativa ao SQL. É o mais próximo possível do SQL bruto — e dos objetivos fundamentais do SQL — sem realmente escrever SQL.
Conforme descrito por Don Chamberlin (um dos principais designers do SQL), o design da linguagem foi guiado por quatro objetivos principais.
O objetivo que estou mais interessado em discutir é o 4: a propriedade “subir e ler”.
Para demonstrar quão fielmente o Drizzle ORM adere aos objetivos originais do SQL, aqui está uma consulta simples que seleciona todos os usuários administradores de uma tabela chamada users
e, em seguida, ordena-os pelo sobrenome.
A primeira consulta é escrita em SQL; o segundo é escrito em JavaScript usando Drizzle ORM.
Acho que você concordará: ambas as consultas podem ser lidas linha por linha sem a necessidade de nenhum treinamento especial.
Minha única pequena queixa é o eq
função usada na consulta Drizzle ORM, que poderia ter sido nomeada equals
para tornar ainda mais fácil subir e ler.
No entanto, as coisas ficam um pouco mais complexas com SQL quando você tenta consultar duas tabelas diferentes e um JOIN
é usado.
No exemplo a seguir, a consulta seleciona pedidos do orders
mesa e junta-se a ela com clientes do customers
tabela usando o customer_id
coluna e limita os resultados a 50.
Como antes, a primeira consulta é escrita em SQL e a segunda em JavaScript usando Drizzle ORM.
Esta não é uma consulta excessivamente complexa, mas o Drizzle ORM ainda está lá e é mais ou menos igual à consulta SQL. A única pequena diferença entre as duas consultas é que enquanto o SQL usa a palavra-chave ON
a consulta do Drizzle ORM usa o eq
função.
Exemplos para fins de demonstração são uma coisa, mas aqui está algo que estou usando atualmente em meu site.
Eu tenho duas tabelas: uma contém dados de reação, a outra contém dados analíticos de geolocalização. Para criar esse recurso, contei as reações positivas enviadas pelos visitantes do meu site e, em seguida, juntei-as aos dados de geolocalização para determinar qual cidade do mundo envia as reações mais positivas.
Aqui está a consulta SQL que usei para criar esse recurso e logo abaixo está o equivalente do Drizzle ORM.
Agora, este é um pouco complicado porque o Drizzle ORM começou a se afastar um pouco do SQL, mas isso não é necessariamente uma coisa ruim.
A consulta SQL usa uma expressão de tabela comum (CTE) chamada happy_reactions
. Um CTE é um resultado temporário que você pode consultar na consulta principal. Nesse caso, o CTE cria uma contagem para as reações positivas dos últimos 30 dias, e a consulta principal seleciona no CTE para recuperar os 50 principais resultados.
A consulta Drizzle ORM atinge o mesmo resultado, mas de forma mais direta, devido à sintaxe de encadeamento baseada em método. Isso pode ser um problema de habilidade da minha parte, mas precisei utilizar sql
para acessar oCOUNT
função.
Ambas as consultas são legíveis, mas a consulta Drizzle ORM parece mais direta porque elimina a necessidade de uma declaração CTE separada. Em vez disso, ele realiza tudo em uma única cadeia de chamadas baseadas em métodos — e eu gosto bastante disso!
As ferramentas JavaScript percorreram um longo caminho ao longo dos anos; praticamente tudo na sua pilha agora pode ser gerenciado a partir da base de código. Essa abordagem permite implantação automatizada, consistente e repetível, juntamente com o gerenciamento de aplicativos, servidores, armazenamento e redes.
Uma dessas tarefas de automação pode ser gerenciar migrações de banco de dados.
A equipe Drizzle ORM também fabrica o Drizzle Kit. Com o Drizzle Kit, você pode realizar atualizações ou migrações do esquema do banco de dados atualizando seu esquema e executando um script.
Por exemplo, se eu quisesse alterar o users
tabela (conforme descrito acima) e adicione uma nova coluna chamada date_of_birth
posso fazer as alterações no esquema e executar drizzle-kit migrate
.
Os arquivos de esquema Drizzle ORM são controlados por versão, assim como todos os outros arquivos em seu projeto JavaScript, o que significa que você sempre terá uma única fonte de verdade, garantindo que seu aplicativo e seu banco de dados estejam sincronizados.
Além disso, executar esse script como parte de seu pipeline de CI/CD significa que quaisquer alterações enviadas para produção podem acontecer ao mesmo tempo.
É muito importante em qualquer aplicação fornecer definições de tipo para que você saiba como lidar com os dados. Tenho certeza de que você conhece o exemplo clássico de número versus string, mas se não estiver:
Por que? Porque as strings são concatenadas. “1” + “1” não é o mesmo que 1 + 1. Como humanos, podemos entender pelo contexto que, neste cenário, estamos falando de aritmética matemática e aplicaríamos adição. JavaScript não é tão inteligente, então precisa de um pouco de orientação. Adicionar tipos a um aplicativo pode ajudar o JavaScript para garantir que você obtenha o resultado pretendido.
Como tal, o TypeScript existe. O TypeScript permite que os desenvolvedores digitem dados estaticamente, da mesma forma que o SQL fez por cerca de 40 anos. Não deveria ser uma surpresa para você, mas digitar dados estaticamente é muito útil ao desenvolver aplicativos complexos, porque permite lidar com mais precisão com os dados que seu aplicativo recebe.
Para demonstrar o que quero dizer, usarei o analytics
tabela usada no meu site como exemplo.
Aqui eu criei um novo tipo TypeScript (eu o chamei AnalyticsType
), e então consegui inferir os tipos do pgTable
definições usando InferSelectModel
de drizzle-orm
pacote. Isso me permitiu ter tipos de esquema SQL que serão definidos em meu banco de dados PostgreSQL, bem como tipos TypeScript que posso usar em meu aplicativo JavaScript.
Suponha que eu tenha uma consulta que selecione a cidade, o país e a bandeira do analytics
mesa. Por exemplo:
O resultado é então passado para um componente React por meio de uma propriedade nomeada analyticsData
:
Posso então usar os tipos TypeScript na interface do componente para garantir que este componente receba apenas os dados de que precisa.
Este componente simples retorna uma lista de visitantes e exibe a cidade, o país e a bandeira — que estão disponíveis nos dados passados através do analyticsData
suporte.
No entanto, há um pequeno problema que você provavelmente encontrará. No esquema da tabela, há várias colunas que não necessariamente preciso para este componente. Como tal, não estou consultando todas as colunas; Estou apenas consultando a cidade, o país e a bandeira.
A interface deste componente — se ele usar o AnalyticsType
criado usando o InferSelectModel
– faltariam algumas colunas e o TypeScript reclamaria porque os tipos não são inferidos como opcionais – eles são obrigatórios.
Para superar isso, usei o recurso integrado do TypeScript Pick
método para extrair apenas os tipos que preciso AnalyticsType
.
Estes ainda são os mesmos tipos definidos no AnalyticsType
interface e ainda correspondem aos tipos que foram definidos no meu esquema de tabela. Digitar componentes dessa maneira me permite saber exatamente quais dados e que tipo de dados estou transmitindo em meu aplicativo.
Tenho que ser honesto: antes do Drizzle ORM, eu estava um pouco relutante em adotar uma solução JavaScript para escrever SQL. Mas através de minhas investigações, aprendi o quão dedicada à causa é a equipe Drizzle ORM. Sempre que possível, seguiram fielmente os objetivos da linguagem SQL. Os únicos lugares onde eles se desviam ligeiramente são onde existem diferenças fundamentais entre as linguagens SQL e JavaScript.
Além disso, é muito legal ter acesso aos tipos TypeScript sem precisar de nenhuma ferramenta extra. Isso me dá confiança ao desenvolver, porque sei que meu aplicativo é seguro de ponta a ponta.
A equipe Drizzle ORM fez um trabalho incrível aqui, e se você estiver escrevendo SQL em ambientes TypeScript, realmente acho que vale a pena dar uma olhada. Drizzle ORM é realmente apenas SQL em um chapéu JavaScript, e eles o usam bem.
YOUTUBE.COM/THENEWSTACK
A tecnologia avança rápido, não perca um episódio. Inscreva-se em nosso canal no YouTube para transmitir todos os nossos podcasts, entrevistas, demonstrações e muito mais.
SE INSCREVER