Visão geral
DBML é uma linguagem de marcação para descrever estruturas de bancos de dados de forma legível. Os principais blocos são Table, Ref, Enum, TableGroup e TablePartial.
- Blocos usam chaves
{ }. - Configurações usam colchetes
[ ]. - Textos normalmente usam aspas simples
'texto'. - Nomes com espaços devem usar aspas duplas.
- Comentários de uma linha usam
//; blocos usam /* ... */.
Table usuarios {
id int [pk, increment]
nome varchar(120) [not null]
}
Este guia resume a linguagem DBML. Recursos muito recentes ou avançados podem ainda não ser renderizados integralmente pelo NyraDB, embora possam permanecer no código.
Projeto e schema
O bloco Project registra metadados do modelo. Schemas qualificam tabelas e outros elementos.
Project loja_virtual {
database_type: 'PostgreSQL'
Note: 'Modelo principal da aplicação'
}
Table financeiro.faturas {
id bigint [pk]
}
Uma tabela sem schema explícito pertence ao schema padrão. Para referenciá-la, use o nome simples; para schemas explícitos, use schema.tabela.
Tabelas
Uma tabela começa com Table, aceita schema, alias e configurações.
Table academico.alunos as A [headerColor: #2563eb] {
id int [pk]
matricula varchar(20) [unique, not null]
Note: 'Cadastro de alunos'
}
Registros de exemplo
Table status {
id int [pk]
descricao varchar
records {
1, 'Ativo'
2, 'Inativo'
}
}
Campos e configurações
O formato básico é nome tipo [configurações]. Tipos com espaços devem usar aspas duplas.
id bigint [pk, increment]
nome varchar(120) [not null]
email varchar(180) [unique, note: 'E-mail principal']
saldo decimal(15,2) [default: 0]
criado_em timestamp [not null]
descricao "double precision"
pk ou primary key: chave primária.null / not null: nulabilidade.unique: valor único.increment: autoincremento.default:: valor padrão.note:: documentação do campo.check:: condição de validação.ref:: relacionamento inline.
Valores padrão
Valores padrão podem ser números, textos, booleanos, null ou expressões entre acentos graves.
ativo boolean [default: true]
tentativas int [default: 0]
perfil varchar [default: 'cliente']
excluido_em timestamp [default: null]
criado_em timestamp [default: `now()`]
Relacionamentos
Relacionamentos podem ser declarados em linha ou em blocos Ref.
Ref: pedidos.usuario_id > usuarios.id
Ref: usuarios.perfil_id - perfis.id
Ref: autores.id <> livros.id
>: muitos para um.<: um para muitos.-: um para um.<>: muitos para muitos.
Relacionamento inline
usuario_id int [ref: > usuarios.id]
Chave composta
Ref: itens.(empresa_id, pedido_numero) > pedidos.(empresa_id, numero)
Ações referenciais
Ref: pedidos.usuario_id > usuarios.id [delete: cascade, update: no action]
Ações comuns: cascade, restrict, set null, set default e no action.
Índices e checks
Table usuarios {
id int
tenant_id int
email varchar
idade int
indexes {
id [pk]
email [unique]
(tenant_id, email) [name: 'uk_tenant_email', unique]
(`lower(email)`) [name: 'idx_email_lower']
}
checks {
`idade >= 0` [name: 'chk_idade']
}
}
Índices aceitam name, unique, pk, type: btree, type: hash e note. Um índice composto marcado como pk representa uma chave primária composta.
Enums
Enum pedido_status {
pendente
confirmado [note: 'Pagamento aprovado']
cancelado
}
Table pedidos {
id int [pk]
status pedido_status [not null, default: 'pendente']
}
Enums também podem ser qualificados por schema, como financeiro.tipo_pagamento.
Notas e comentários
// Comentário de uma linha
/*
Comentário em bloco
*/
Note modelo_geral {
'Observações sobre o modelo.'
}
Table produtos {
id int [pk]
Note: 'Tabela de produtos'
}
Notas documentam projetos, tabelas, campos, relacionamentos e enums sem alterar a estrutura lógica.
Grupos e TablePartials
TableGroup
TableGroup vendas [color: #f59e0b] {
clientes
pedidos
itens_pedido
}
TablePartial
TablePartial auditoria {
criado_em timestamp [not null]
atualizado_em timestamp
}
Table clientes {
id int [pk]
~auditoria
}
TablePartial reutiliza campos, configurações e índices. A injeção é feita com ~nome_do_partial.
Exemplo completo
Project loja {
database_type: 'PostgreSQL'
}
Enum pedido_status {
pendente
confirmado
cancelado
}
Table usuarios {
id bigint [pk, increment]
nome varchar(120) [not null]
email varchar(180) [not null, unique]
}
Table pedidos {
id bigint [pk, increment]
usuario_id bigint [not null]
status pedido_status [not null, default: 'pendente']
criado_em timestamp [default: `now()`]
indexes {
usuario_id
(usuario_id, criado_em) [name: 'idx_pedidos_usuario_data']
}
}
Table itens_pedido {
pedido_id bigint [not null]
produto_id bigint [not null]
quantidade int [not null, check: `quantidade > 0`]
indexes {
(pedido_id, produto_id) [pk]
}
}
Ref: pedidos.usuario_id > usuarios.id
Ref: itens_pedido.pedido_id > pedidos.id
Ref: itens_pedido.produto_id > produtos.id
Nenhum tópico encontrado.