Executando verificação de segurança...
2

Qual é o melhor ORM, na sua opnião, para Node ?

Atualmente estou apredendo a ultilizar o framework Nest.Js. A parte boa é que ele é mais flexivel para usar as ferramentas e estruturas de sua preferencia, mas ao mesmo tempo, essa vantagem se torna uma desvatagem por cada dia que passa, as possíbilidades de ferramentas que prometem resolver os mesmos problemas.

Então minha pergunta é bem 'simples', na sua humilde opnião, qual seria o melhor ORM para trabalhar com banco de dados, considerando que precisa trabalhar com consultas simples até as mais complexas possiveis envolvendo várias tabelas?

Carregando publicação patrocinada...
4

Por que você precisa de um ORM?

Tenho um projeto em Node.js sem ORM. Tive algumas dificuldades pontuais para tentar criar um código útil que não fosse muito específico, mas acho que fui me encontrando ao longo do desenvolvimento. Me parece que foi uma decisão acertada não usar ORM.

Já usei Sequelize e tive algumas dificuldades (fazem alguns anos, então nem lembro quais foram para mencionar). Já vi o TypeORM sendo muito bem falado, até que chegou o Prisma para pegar o lugar de "ORM modinha do momento". Não experimentei nenhum desses dois então não sei dizer sobre a qualidade deles.

Vendo a documentação Prisma vs TypeORM (que está no site do Prisma, então tenha em mente o enviesamento), em especial na seção Data modeling and migrations, está um ponto que me incomoda sobre alguns ORMs. Veja como o código do ORM se entrelaça ao seu, parecendo ser uma única coisa (que não é JavaScript), te tornando dependente.

Esse meu comentário é uma questão de gosto pessoal, mas eu repito: não vi necessidade de usar ORM no meu projeto.

Como bônus, o TabNews não usa ORM e você pode ler qual foi a opinião do Filipe na hora dessa decisão aqui: Vocês topam sofrer comigo?

1
1
1

Obrigado pelo seu comentário! Mas honestamente, na minha visão, apesar de ser fundamental saber consultas manuais já que em algum momento irá precisar, os ORMs existem para aumentar a produtividade do desenolvedor.

Para que criar toda uma consulta para selecionar algo se eu conseido fazendo, sla: "user.find()". ORms são práticos.

É claro que tudo precisa de contextos para ser ultilziados, mas em produção, tudo o que tu quer é agilidade e praticidade.

Na verdade, o motivo do meu post é justamente tentar entender qual ORM está mais maduro e pronto para projetos médios e grandes, para ter menos riscos.

1

ORM é muito utilizado em projetos pequenos e médios, em projetos gigantes vejo mais sql cru. Empresas grandes não confiam muito em bibliotecas de terceiro, principalmente porquê pode ter erro em alguma versão, aí atualiza e algo mudou, depois tem que alterar mais código.
Essa conclusão tirei conversando com devs com mais experiência e que trabalhou em empresas gigantescas. Em projetos pessoais só utilizo Prisma, acho a sintaxe dele "interessante", além de servir para consultas mais "simples" e repetitivas, como fazer um select com alguns joins, quando precisa de algo mais complexo precisa de um SQL.

Isso é minha visão de um jovem que está entrando agora no mercado de trabalho.

1
1
1

Nunca vi alguém argumentando mais profundamente sobre o uso de ORMs, sempre era algo superficial no ponto de "você pode usar .findAll() e pronto!". A questão é que, num projeto de verdade, você muito provavelmente não quer usar um SELECT * e quase não terá SELECT sem WHERE.

Não acho que eu consiga te dar boas dicas de como fazer sem usar ORM porque não tenho referência nisso fora de ambiente de estudo (escola/faculdade). O que eu fiz foi identificar um tipo de abstração simples para lidar no meu projeto logo no início, e então ir acoplando as necessidades conforme avançava. Acabei tendo uma classe genérica para fazer find, por exemplo, que aceita um where como string ao invés de ficar algo como em ORMs, que você passa um objeto que vai tendo cada vez mais campos e mais profundidade conforme a consulta tem mais condições. Mas sempre que preciso de algo que não seja básico, já faço um SELECT "cru", sem usar abstração.

1

Po, eu gosto de usar ORM independente de qualquer coisa, claro que é sempre bom saber fazer sem, mas gosto da camada adicional de segurança que adiciona, que não precisa que eu faça um prepared statement e várias outras etapas pra evitar sql injection por exemplo.

1
1

cara depende, depende do banco que você vai trabalhar, depende dos recursos que você vai utilizar e se o orm vai ter suporte aqueles recursos de forma nativa, o orm abstrai bastante coisa mas eles tem um porém que é usar uma estratégia de criação das queries que para wueries simoles atende bem mas a medida que as queries vai ficando mais complexas a estratégia aue eles utilizam oode nao ser a melhor, nas issi é facilmente resolvido criando uma query manualmente desde, coisa que grande parte se não todos os orm's suportam, eu utilizo bastante o prisma por conta do suporte com typescript e a geração das tipagens com base nas models que é incrível, acredito que hoje seja uns do orms mais populares, mas vai depender do que for colocado na balança, suporte, se o orm tem manutenção, se a documentação dele é clara se o ganho de produtividade é relavante suficiente pra valer a oena adicionar essa camada de complexidade e por fim você pode criar uma camada de abstração a nivel da sua aplicação, usando o pattern repository que vai centralizar todas as suas consultas na base de dados numa camada da sua aplicação, dessa forma como a consulta é feita ou não debaixo dos panos pro sistema é indiferente voce tem uma entrada e tem uma saída, se o orm ou estratégia de acesso que você optou deixar de ser viável por algum motivo basta fazer as alterações nessa camada sem influenciar a aplicação como um todo.

1

Ja utilizei o type, sequelize e prisma. Acredito que agilizar bastante e utilizando uma metologia clean você consegue tirar bastante a dependência.

A única coisa que eu não gosto no prisma é aquela junção dos modelos em um arquivo único, mas acho ele fantástico e a comunidade está utilizando muito ele.

1

tenho usado o https://www.npmjs.com/package/sequelize-typescript a bastante tempo e tenho estado bem satisfeito. não é necessário usar injeção de dependência com o nest.js. Só de iniciar uma conexão todos os models viram um singleton que te permite simplesmente importar o model e sair usando users = await user.findAll() que users já vem corretamente tipado.
Para testes de integração, inicio uma conexão usando sqlite em memória e tudo funciona normalmente.
Bom mas bom mesmo é o gorm, do go :)

1

Eu trabalho com PHP e uso muito Laravel, Eloquent ORM. Um dia precisei pegar um projeto com nest.js e procurei algo parecido com o que eu ja conhecia, e encontrei uma combinação que serviu muito bem. knex.js e objection.js. Com essa combinação eu consigo fazer tanto consultas "cruas" no banco, quanto consultas baseadas nas minhas classes de entidade (no Laravel são models).

https://knexjs.org/
https://vincit.github.io/objection.js/

Acho que com os outros mais falados (type orm, sequelize, prisma, etc) você consegue fazer as mesmas coisas que com esta combinação, mas eu acho que a dev exp do objection muito boa e quando precisar de algo mais complexo, é fácil usar o knex pra fazer uma consulta crua, vale conferir.

1

Todo mundo defendendo o prisma. Vou defender o typeorm.
Eu acho que o prisma tem a vantagem de iniciar bem rápido. Mas com typeorm eu me sinto mais seguro. Eu acho ele mais a cara do nest, é como que um tivesse sido feito para o outro. Eles funcionam de forma tão integrada, tão fluida que deixa o prisma parecendo gambiarra.

O typeorm segue mais os padrões do nest, como injeção de dependências, divisão em módulos e a configuração com decorators. O prisma,se você tem uma base que você quer aproveitar em outros sistemas, você tem mais dificuldade de ficar catando as coisas pra levar de um sistema pra outro. Com typeorm você é obrigado a deixar tudo separadinho. A vontade de fazer uma consulta perdida no meio de um moduta outro módulo totalmente diferente é grande. Com prisma você simplesmente faz e funciona. Com typeorm você precisa planejar melhor devido a injeção de dependência. Você é forçado a pensar mais e deixar seus módulos mais independentes entre si.

O tempo de início dele é maior. O prisma é bem mais fácil de iniciar, mas aquele arquivo de configuração vira um caos muito rapidamente quando o sistema começa a crescer. No quesito organização, o typeorm ganha de lavada.

Basicamente eu uso os 2. Typeorm quando o sistema tem previsão de ficar maior e prisma quando é uma coisa mais rápida.

Mas eu entendo essa dúvida. Eu também tive os mesmos questionamentos quando comecei a estudar nest. Ele é um sistema tão poderoso que você consegue ter muitas variações de como usar. No início tive bastante dificuldade em escolher pois via muitas formas diferentes de uso. Mas hoje estou confortável com minha escolha.

1

Trabalho com NestJS ha 1 ano e utilizo TypeORM diariamente, tambem ja utilizei o Prisma.

Minha visão geral, quando voce quer desenvolver algo rapido e voce sabe que não vai escalar muito Prisma é uma ótima opção, ele é simples isso torna o desenvolvimento com ele bem rapido, agora quando voce quer construir uma API que voce sabe que vai se tornar um monstrinho, eu prefiro TypeORM.

TypeORM é um misto de ame ou odeie, eu gosto muito por poder trabalhar com Repository Pattern, quando funciona, funciona bem, mas quando voce tem problema, se torna uma dor de cabeça, no meu serviço prescisei atualizar varias versoes do NestJS/TypeORM para uma nova, e eu nunca odiei tanto TypeORM na minha vida, varias coisas que funcionavam muito bem simplesmente não funcionam mais, mudaram um monte de coisa e quando voce olha fica pensando... Porque raios mudaram isso? Funcionava tão bem, fora que muita coisa foi depreciada e simplesmente não dão alternativas, voce que se vire, e eu nem presciso falar daquela documentação PORCA deles, muita coisa eu só encontrei porque fui olhar o Changelog do Github no repositorio do TypeORM (Mais uma vez me questionando, PORQUE RAIOS ISSO NÃO ESTA NA DOCUMENTAÇÃO), o maior problema do TypeORM é quem esta mantendo ele, mudanças questionaveis, uma das piores documentação que ja vi, coisas criticas que sofreram alteração e simplesmente não colocaram na documentação, etc...

Prisma não tem muito o que falar, a comunidade deu um jeito de trabalhar com Repository Pattern (ao qual me parece uma gambiarra), e pelo que li isso nunca vai se tornar official porque em alguns PR pra discussao sobre isso no repositorio do Prisma, os proprios mantenedores disseram que não querem isso pro Prisma etc... Pra projetos rapidos e pequenos eu acho uma otima opção sim, ja vi muitas pessoas utilizando ele em projetos grandes e não falaram mal não.

pesquisando alternativas, uma que ouvi falar muito bem foi o Mikro ORM.

1

To usando Sequelize num projeto, coisas simples funcionam bem, mas se precisar de consulta aninhada, converter de datatypes (ex.: boolean (s/n ou y/s ou 0/1)) e loadLazy aninhado, vc esta lascado;
Boa parte dessas coisas avancadas nao funcionam bem;
Ainda desonsiderando o fato de que mesmo sendo TS, eh perfeitamente possivel um "caminhao" aceitar um objeto "bicicleta";

1

Sinceramente, após usar diferentes ORMs, em diferentes linguagens e agora trabalhando exclusivamente com Node, eu diria que o Prisma realmente salva seu tempo, porém, eu diria que por muitas vezes vc precisaria mais de um Query Builder do que o ORM em si.

Um bom exemplo de query builder que vc pode usar é o Knex, vc consegue ter um controle maior sobre suas entidades e ainda sim, ter uma flexibilidade para criar queries e agilizar um pouco o lado da camada de acesso a dados.

1

Hoje em dia provavelmente typeorm por que ele usa a sistematica de query builder ao contrário do prisma que usa uma especie de graphQL pra definir.

1
1

usei o prisma recentemente e foi uma excelente experiência, muito massa mesmo, além de permitir usar a query 'crua'.

no meu caso, precisava da query crua em uma situação envolvendo vários joins, group by e me atendeu perfeitamente.

outro ORM que me enche os olhos é o Drizzle, mas esse só conheço por hobby, nunca usei profissionalmente (ainda).

1

Dentre os que utilizei até hoje (TypeORM, Knex, Prisma), o que mais me adaptei foi o Prisma, gosto bastante da praticidade que ele oferece.
Recentemente vi sugestões sobre o Kysely (https://kysely.dev/), e apesar de parecer promissor, ainda não cheguei a testar.

1

Tive que justificar a escolha de uma ORM num projeto simples de API e essa foi minha resposta:

O Sequelize é mais sólido e pode ser mais rápido que o Prisma (seria um alternativa popular), apesar de nos dias de hoje existem discussões dizendo que estão parecidos nesse termo de desempenho. Existem benchmarks de 2021 mostrando a comparação citada no inicio, onde o Sequelize ganha.

A escolha também foi embasada em que o framework é antigo e vem sempre sendo atualizado, com uma boa comunidade, além de ser bem verboso, o que ajuda ainda mais no entendimento outros programadores, podendo até serem iniciantes que conseguirão ao menos compreender o que acontece.


Mantenho o que disse, prefiro o Sequelize, gosto mais da sintexa e sempre me atendeu bem, existem outras alternativas dependendo do que você quer, mas as que eu sei é o que todos já falaram: TypeORM, MikroORM, Prisma, Knex e o Drizzle.
Mas algumas são só pra Typescript, porque usam anotações e tal, eu sigo preferindo o sequelize.