Banco de Dados — Configuração
A Jade DSL abstrai a conexão com banco de dados via o bloco banco. Com poucas linhas você conecta seu projeto a PostgreSQL, MySQL, SQLite ou Supabase — sem ORM, sem configuração de driver, sem migrations manuais.
Sintaxe básica
banco
tipo: postgres
url: env("DATABASE_URL")
jwt: env("JWT_SECRET")
fimO compilador valida o bloco e gera automaticamente um jade-server.js com toda a infraestrutura de servidor.
Opções de configuração
| Campo | Obrigatório | Descrição |
|---|---|---|
tipo | sim | Banco de dados: postgres, mysql, sqlite, supabase |
url | sim | String de conexão — sempre via env() |
jwt | não | Secret para autenticação JWT (recomendado) |
porta | não | Porta do servidor gerado (padrão: 3000) |
Tipos suportados
// PostgreSQL
banco
tipo: postgres
url: env("DATABASE_URL")
jwt: env("JWT_SECRET")
fim
// MySQL
banco
tipo: mysql
url: env("DATABASE_URL")
jwt: env("JWT_SECRET")
fim
// SQLite (desenvolvimento local)
banco
tipo: sqlite
url: env("DATABASE_URL")
fim
// Supabase
banco
tipo: supabase
url: env("SUPABASE_URL")
jwt: env("SUPABASE_ANON_KEY")
fimVariáveis de ambiente obrigatórias
Credenciais nunca devem estar em código-fonte. O compilador gera erro se você usar string literal:
banco
tipo: postgres
url: "postgresql://user:senha@localhost/db" // ERRO: credenciais em código-fonte
fimUse sempre env("NOME_DA_VARIAVEL"):
banco
tipo: postgres
url: env("DATABASE_URL") // lido de .env em tempo de execução
jwt: env("JWT_SECRET")
fimConfigure o arquivo .env na raiz do projeto:
DATABASE_URL=postgresql://user:senha@localhost:5432/minha_app
JWT_SECRET=meu-segredo-super-longo-aquiPorta do servidor
Por padrão o servidor gerado sobe na porta 3000. Para mudar:
banco
tipo: postgres
url: env("DATABASE_URL")
jwt: env("JWT_SECRET")
porta: 8080
fimPolíticas de acesso — politica (RLS)
O bloco politica dentro de banco gera Row-Level Security automática. Cada entidade pode ter uma política que restringe acesso ao dono do registro.
banco
tipo: postgres
url: env("DATABASE_URL")
jwt: env("JWT_SECRET")
politica Produto
dono: usuarioId
fim
politica Pedido
dono: clienteId
fim
fimComo funciona
O campo dono: aponta para um campo da entidade que deve ser igual ao sub do JWT do usuário autenticado:
insert: o campo dono é preenchido automaticamente com ousuarioIddo token (evita forge)update/delete: retorna403 Forbiddense o usuário não é o dono do registroselect: filtra automaticamente, retornando apenas registros do usuário
entidade Produto
id: id
nome: texto
preco: decimal
usuarioId: id // campo referenciado em politica.dono
fim
banco
tipo: postgres
url: env("DATABASE_URL")
jwt: env("JWT_SECRET")
politica Produto
dono: usuarioId
fim
fimEntidade ausente gera erro
O compilador valida que a entidade referenciada existe:
banco
tipo: postgres
url: env("DATABASE_URL")
politica ProdutoInexistente // ERRO: 'ProdutoInexistente' não está declarada
dono: usuarioId
fim
fimArquivo gerado: jade-server.js
Ao compilar, o compilador gera jade-server.js com:
- Servidor HTTP (Express/Fastify) na porta configurada
- Conexão com o banco usando as variáveis de ambiente
- Endpoints REST para cada entidade (
GET,POST,PUT,DELETE) - Middleware de JWT se
jwt:estiver configurado - RLS automático para cada política declarada
Para rodar:
node jade-server.jsOu com variáveis de ambiente inline:
DATABASE_URL=postgresql://... JWT_SECRET=... node jade-server.jsRegras do compilador
- Apenas um bloco
bancopor programa — duplicata gera erro semântico env()é obrigatório paraurlejwt— string literal é recusada com erro educativotipoaceita apenas:postgres,mysql,sqlite,supabase- Entidades referenciadas em
politicadevem existir no mesmo arquivo
Exemplo completo — estoque com autenticação
entidade Produto
id: id
nome: texto
preco: decimal
estoque: numero
ativo: booleano
usuarioId: id
fim
banco
tipo: postgres
url: env("DATABASE_URL")
jwt: env("JWT_SECRET")
porta: 4000
politica Produto
dono: usuarioId
fim
fim
servico EstoqueService
funcao adicionarProduto(nome: texto, preco: decimal): Produto
variavel p = Produto()
p.nome = nome
p.preco = preco
p.estoque = 0
p.ativo = verdadeiro
salvar p
retornar p
fim
funcao listarAtivos(): lista<Produto>
retornar EntityManager.buscar(Produto)
fim
fim