Spraxium logoSpraxium

Banco de Dados da CLI

Como spraxium database cria, em segundos, um módulo completo de integração com ORM. Escolha seu ORM e o mecanismo de banco no assistente interativo e comece a escrever queries imediatamente.

O que ele faz

spraxium database, com alias spraxium db, gera um módulo de banco de dados totalmente conectado dentro do seu projeto. Ele conduz você por um assistente interativo em que é possível escolher um ORM e um mecanismo de banco, depois gera os arquivos do módulo, ajusta a configuração de ambiente com as chaves exigidas, instala os pacotes necessários e, opcionalmente, registra o módulo no seu AppModule. Ao final do assistente, o projeto já está pronto para executar queries sem configuração manual.

O comando aceita um argumento opcional de ORM para pular a primeira etapa de escolha. Quando você já sabe o que quer, spraxium database prisma vai direto para o prompt do mecanismo de banco.

Quando usar

Use esse comando no começo de um projeto ou ao adicionar acesso a banco de dados a uma aplicação Spraxium existente. Ele equivale a instalar pacotes manualmente, escrever o boilerplate de conexão e registrar o módulo, só que condensado em um único fluxo interativo. Rode uma vez por integração de banco; para mudanças de schema ou migrations, use as ferramentas do ORM diretamente depois do setup.

ORMs suportados

O que o assistente faz

Seleção do ORM

Se você não passar um ORM como argumento na CLI, o assistente apresenta uma lista interativa com os cinco ORMs suportados e uma breve descrição de cada um. Navegue com as setas e pressione Enter para confirmar.

Seleção do mecanismo de banco

Para ORMs com suporte a múltiplos mecanismos, como Prisma, Drizzle, TypeORM e Mikro-ORM, o assistente pergunta qual mecanismo deve ser usado. O Mongoose pula essa etapa porque trabalha apenas com MongoDB.

Nome do módulo

O assistente pede o nome do módulo, usando database como padrão. O nome é convertido para kebab-case na pasta e para PascalCase nos nomes de classe. Um nome como user-db gera um UserDbModule e um diretório src/modules/user-db/.

Geração de arquivos

A CLI baixa o template correspondente à combinação de ORM e mecanismo e grava os arquivos de módulo, serviço, schema e configuração em src/modules/{name}/. Um arquivo de configuração na raiz, como drizzle.config.ts ou prisma/schema.prisma, também é adicionado quando o ORM exige isso.

Injeção de chaves de ambiente

As variáveis de ambiente necessárias, como DATABASE_URL, DATABASE_PATH e outras, são acrescentadas automaticamente ao seu app.env.ts se ainda não estiverem presentes. Não é preciso editar nada manualmente.

Instalação de pacotes

O assistente pergunta se você quer instalar os pacotes imediatamente. Ao confirmar, ele usa o gerenciador de pacotes detectado para adicionar as dependências de runtime, como o client do ORM e o driver do banco, e as dependências de desenvolvimento, como ferramentas de CLI e definições de tipos. Comandos pós-instalação, como npx prisma generate, também rodam automaticamente.

Registro no AppModule

Se um app.module.ts for encontrado em src/, o assistente oferece a opção de adicionar automaticamente o módulo gerado ao array imports. Isso conecta o módulo ao container de DI para que você possa injetar o DatabaseService em qualquer lugar da aplicação.

Estrutura de arquivos gerada

Os arquivos exatos variam de acordo com o ORM, mas o layout segue a mesma convenção em todas as combinações.

project structure
database.module.ts
database.service.ts
database.schema.ts

Arquivos de configuração na raiz também são criados

Alguns ORMs exigem um arquivo de configuração na raiz do projeto. O Prisma gera um diretório prisma/ com schema.prisma. O Drizzle gera drizzle.config.ts. Esses arquivos são gravados ao lado dos arquivos do módulo e devem ser versionados.

Depois do assistente

Quando o comando termina, você já pode injetar DatabaseService em qualquer handler, guard ou serviço dentro do mesmo escopo de módulo. O serviço é exportado pelo módulo de banco de dados, então basta importar DatabaseModule em qualquer outro módulo para ter acesso a ele por meio do container de DI.

src/modules/hello/hello.service.ts
import { Injectable } from '@spraxium/common';
import { DatabaseService } from '../database/database.service';

@Injectable()
export class HelloService {
  constructor(private readonly db: DatabaseService) {}

  async getCount(): Promise<number> {
    // Use the ORM client returned by the service
    return this.db
      .getDb()
      .select()
      .from(table)
      .then((rows) => rows.length);
  }
}