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.
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.
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);
}
}