POSTGRESQL INSERT - Inserir Registro
O que é este Node?
O POSTGRESQL INSERT é o node responsável por inserir novos registros em tabelas PostgreSQL de forma segura usando prepared statements.
Por que este Node existe?
Inserir dados é operação fundamental em bancos de dados. O POSTGRESQL INSERT existe para:
- Segurança: Usa prepared statements prevenindo SQL injection
- Simplicidade: Interface estruturada sem escrever SQL manualmente
- Auto-commit: Commit automático da transação
- RETURNING: Retorna registro inserido com valores gerados (id, timestamps)
- Validação: Valida campos antes de executar
- Performance: Otimizado para inserções únicas
Como funciona internamente?
Quando o POSTGRESQL INSERT é executado, o sistema:
- Valida config: Verifica credenciais PostgreSQL
- Substitui variáveis: Troca {{variavel}} por valores do contexto em values
- Monta SQL: Cria INSERT com placeholders ($1, $2, ...) seguros
- Executa: Envia para PostgreSQL com valores parametrizados
- Retorna: Devolve registro inserido (com ID gerado) e rowCount
- Fecha conexão: Encerra pool
- Se erro: Lança exceção (constraint violation, tipo inválido, etc.)
Código interno (postgresql.executor.ts:104-124):
private async insertRow(
pool: Pool,
table: string,
fields: string[],
values: Record<string, any>,
context: ExecutionContext,
): Promise<any> {
const replacedValues = this.replaceObjectVariables(values, context.variables);
const columns = Object.keys(replacedValues).join(', ');
const placeholders = Object.keys(replacedValues).map((_, i) => `$${i + 1}`).join(', ');
const valueArray = Object.values(replacedValues);
const query = `INSERT INTO ${table} (${columns}) VALUES (${placeholders}) RETURNING *`;
const result = await pool.query(query, valueArray);
return {
insertedRow: result.rows[0],
rowCount: result.rowCount,
};
}
Quando você DEVE usar este Node?
Use POSTGRESQL INSERT quando precisar inserir registros estruturados:
Casos de uso
- Cadastro de usuário: "Salvar dados de novo cliente"
- Registro de pedido: "Criar novo pedido no sistema"
- Log de evento: "Gravar ação do usuário"
- Criação de produto: "Adicionar produto ao catálogo"
- Inserção simples: "Adicionar linha única em tabela"
Quando NÃO usar POSTGRESQL INSERT
- Query complexa: Use POSTGRESQL EXECUTEQUERY para INSERT com subconsultas
- Múltiplas inserções: Execute múltiplos nodes ou use EXECUTEQUERY com VALUES múltiplos
- Insert ou Update: Use POSTGRESQL INSERTORUPDATE (upsert)
- Condicional: Se precisa verificar existência antes, use INSERTORUPDATE
Parâmetros Detalhados
config (object, obrigatório)
O que é: Configuração de conexão com PostgreSQL.
Estrutura:
{
"host": "localhost",
"port": 5432,
"database": "nome_database",
"user": "usuario",
"password": "senha",
"ssl": false
}
table (string, obrigatório)
O que é: Nome da tabela onde será inserido o registro.
Formato: Nome válido de tabela PostgreSQL (sem schema usa public)
Com schema: Use "schema_name.table_name" se tabela está em schema específico
values (object, obrigatório)
O que é: Objeto com pares campo: valor a serem inseridos.
Formato: { "campo1": "valor1", "campo2": 123, "campo3": true }
Suporte a variáveis: Use {{variavel}} para valores dinâmicos
Flow completo para testar:
{
"name": "Teste PostgreSQL - Insert",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Nome",
"parameters": {
"message": "Qual seu nome completo?",
"variable": "nome"
}
}
},
{
"id": "email_1",
"type": "email",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Email",
"parameters": {
"message": "Seu email:",
"variable": "email"
}
}
},
{
"id": "phone_1",
"type": "phone",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Telefone",
"parameters": {
"message": "Seu telefone:",
"variable": "telefone"
}
}
},
{
"id": "postgres_1",
"type": "postgresql",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Salvar Cliente",
"parameters": {
"operation": "insert",
"config": {
"host": "localhost",
"port": 5432,
"database": "crm",
"user": "app_user",
"password": "secure_password",
"ssl": false
},
"table": "clientes",
"values": {
"nome": "{{nome}}",
"email": "{{email}}",
"telefone": "{{telefone}}",
"data_cadastro": "NOW()",
"ativo": true
},
"responseVariable": "clienteInserido"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Confirmação",
"parameters": {
"message": "Cliente cadastrado com sucesso!\n\nID: {{clienteInserido.insertedRow.id}}\nNome: {{nome}}\nEmail: {{email}}"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1300, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "email_1" },
{ "source": "email_1", "target": "phone_1" },
{ "source": "phone_1", "target": "postgres_1" },
{ "source": "postgres_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Teste: Registro é inserido e ID gerado é retornado.
responseVariable (string, opcional)
O que é: Nome da variável para armazenar resultado no contexto.
Conteúdo: Objeto com insertedRow (registro completo inserido) e rowCount
Parâmetros
| Campo | Tipo | Obrigatório | Descrição |
|---|---|---|---|
| operation | string | Sim | Deve ser "insert" |
| config | object | Sim | Configuração de conexão PostgreSQL |
| config.host | string | Sim | Endereço do servidor PostgreSQL |
| config.port | number | Não | Porta (padrão: 5432) |
| config.database | string | Sim | Nome do database |
| config.user | string | Sim | Usuário PostgreSQL |
| config.password | string | Sim | Senha do usuário |
| config.ssl | boolean | Não | Usar SSL (padrão: false) |
| table | string | Sim | Nome da tabela |
| values | object | Sim | Pares campo:valor a inserir |
| responseVariable | string | Não | Variável para armazenar resultado |
Exemplo 1: Cadastro Completo de Cliente
Objetivo: Coletar dados do cliente e inserir no banco
JSON para Importar
{
"name": "PostgreSQL - Cadastro Cliente",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "message_1",
"type": "message",
"position": { "x": 300, "y": 100 },
"data": {
"label": "Boas-vindas",
"parameters": {
"message": "Bem-vindo ao cadastro de clientes! Vamos coletar seus dados."
}
}
},
{
"id": "input_1",
"type": "input",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Nome",
"parameters": {
"message": "Nome completo:",
"variable": "nome"
}
}
},
{
"id": "email_1",
"type": "email",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Email",
"parameters": {
"message": "Email:",
"variable": "email"
}
}
},
{
"id": "phone_1",
"type": "phone",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Telefone",
"parameters": {
"message": "Telefone:",
"variable": "telefone"
}
}
},
{
"id": "input_2",
"type": "input",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Cidade",
"parameters": {
"message": "Cidade:",
"variable": "cidade"
}
}
},
{
"id": "postgres_1",
"type": "postgresql",
"position": { "x": 1300, "y": 100 },
"data": {
"label": "Salvar no DB",
"parameters": {
"operation": "insert",
"config": {
"host": "localhost",
"port": 5432,
"database": "crm",
"user": "app_user",
"password": "secure_password",
"ssl": false
},
"table": "clientes",
"values": {
"nome": "{{nome}}",
"email": "{{email}}",
"telefone": "{{telefone}}",
"cidade": "{{cidade}}",
"data_cadastro": "CURRENT_TIMESTAMP",
"origem": "whatsapp",
"ativo": true
},
"responseVariable": "resultado"
}
}
},
{
"id": "message_2",
"type": "message",
"position": { "x": 1500, "y": 100 },
"data": {
"label": "Sucesso",
"parameters": {
"message": "Cadastro realizado com sucesso!\n\nID: {{resultado.insertedRow.id}}\nNome: {{nome}}\nEmail: {{email}}\nTelefone: {{telefone}}\nCidade: {{cidade}}\n\nObrigado pelo cadastro!"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "message_1" },
{ "source": "message_1", "target": "input_1" },
{ "source": "input_1", "target": "email_1" },
{ "source": "email_1", "target": "phone_1" },
{ "source": "phone_1", "target": "input_2" },
{ "source": "input_2", "target": "postgres_1" },
{ "source": "postgres_1", "target": "message_2" },
{ "source": "message_2", "target": "end_1" }
]
}
Saída esperada:
Sistema: Bem-vindo ao cadastro de clientes! Vamos coletar seus dados.
Sistema: Nome completo:
Usuário: José Roberto Silva
Sistema: Email:
Usuário: jose@example.com
Sistema: Telefone:
Usuário: 11987654321
Sistema: Cidade:
Usuário: São Paulo
Sistema: Cadastro realizado com sucesso!
ID: 42
Nome: José Roberto Silva
Email: jose@example.com
Telefone: 11987654321
Cidade: São Paulo
Obrigado pelo cadastro!
Exemplo 2: Registro de Pedido
Objetivo: Criar pedido vinculado a cliente existente
JSON para Importar
{
"name": "PostgreSQL - Criar Pedido",
"nodes": [
{
"id": "start_1",
"type": "start",
"position": { "x": 100, "y": 100 },
"data": { "label": "Início" }
},
{
"id": "input_1",
"type": "input",
"position": { "x": 300, "y": 100 },
"data": {
"label": "ID Cliente",
"parameters": {
"message": "ID do cliente:",
"variable": "clienteId"
}
}
},
{
"id": "input_2",
"type": "input",
"position": { "x": 500, "y": 100 },
"data": {
"label": "Produto",
"parameters": {
"message": "Nome do produto:",
"variable": "produto"
}
}
},
{
"id": "number_1",
"type": "number",
"position": { "x": 700, "y": 100 },
"data": {
"label": "Quantidade",
"parameters": {
"message": "Quantidade:",
"variable": "quantidade",
"min": 1
}
}
},
{
"id": "number_2",
"type": "number",
"position": { "x": 900, "y": 100 },
"data": {
"label": "Valor Unitário",
"parameters": {
"message": "Valor unitário (R$):",
"variable": "valorUnitario",
"decimals": 2,
"min": 0.01
}
}
},
{
"id": "variable_1",
"type": "variable",
"position": { "x": 1100, "y": 100 },
"data": {
"label": "Calcular Total",
"parameters": {
"assignments": [
{
"variable": "valorTotal",
"value": "{{quantidade}} * {{valorUnitario}}"
}
]
}
}
},
{
"id": "postgres_1",
"type": "postgresql",
"position": { "x": 1300, "y": 100 },
"data": {
"label": "Inserir Pedido",
"parameters": {
"operation": "insert",
"config": {
"host": "localhost",
"port": 5432,
"database": "ecommerce",
"user": "app_user",
"password": "secure_password",
"ssl": false
},
"table": "pedidos",
"values": {
"cliente_id": "{{clienteId}}",
"produto": "{{produto}}",
"quantidade": "{{quantidade}}",
"valor_unitario": "{{valorUnitario}}",
"valor_total": "{{valorTotal}}",
"status": "pendente",
"data_pedido": "CURRENT_TIMESTAMP"
},
"responseVariable": "pedido"
}
}
},
{
"id": "message_1",
"type": "message",
"position": { "x": 1500, "y": 100 },
"data": {
"label": "Confirmação",
"parameters": {
"message": "Pedido criado com sucesso!\n\nNúmero do Pedido: {{pedido.insertedRow.id}}\nProduto: {{produto}}\nQuantidade: {{quantidade}}\nValor Total: R$ {{valorTotal}}\nStatus: Pendente"
}
}
},
{
"id": "end_1",
"type": "end",
"position": { "x": 1700, "y": 100 },
"data": { "label": "Fim" }
}
],
"edges": [
{ "source": "start_1", "target": "input_1" },
{ "source": "input_1", "target": "input_2" },
{ "source": "input_2", "target": "number_1" },
{ "source": "number_1", "target": "number_2" },
{ "source": "number_2", "target": "variable_1" },
{ "source": "variable_1", "target": "postgres_1" },
{ "source": "postgres_1", "target": "message_1" },
{ "source": "message_1", "target": "end_1" }
]
}
Saída esperada:
Sistema: ID do cliente:
Usuário: 42
Sistema: Nome do produto:
Usuário: Notebook Dell
Sistema: Quantidade:
Usuário: 2
Sistema: Valor unitário (R$):
Usuário: 2500.00
Sistema: Pedido criado com sucesso!
Número do Pedido: 15
Produto: Notebook Dell
Quantidade: 2
Valor Total: R$ 5000.00
Status: Pendente
Resposta do Node
{
"insertedRow": {
"id": 42,
"nome": "José Roberto Silva",
"email": "jose@example.com",
"telefone": "11987654321",
"cidade": "São Paulo",
"data_cadastro": "2025-01-15T14:30:00.000Z",
"origem": "whatsapp",
"ativo": true
},
"rowCount": 1
}
Boas Práticas
✅ SIM:
- Use prepared statements (implementado automaticamente)
- Valide dados antes de inserir
- Trate campos obrigatórios (NOT NULL)
- Use DEFAULT no banco para timestamps
- Capture ID gerado em responseVariable
- Verifique unicidade antes (email, CPF, etc.) com query prévia
❌ NÃO:
- Não insira sem validar formato (email, telefone, CPF)
- Não ignore constraints do banco
- Não use INSERT para atualizar (use UPDATE ou UPSERT)
- Não insira dados sensíveis sem criptografia
- Não ignore valores de retorno (ID gerado)
Dicas
💡 RETURNING: PostgreSQL retorna registro completo com valores gerados (id, timestamps, defaults)
💡 SERIAL/IDENTITY: Não inclua campo auto-increment em values (banco gera automaticamente)
💡 Timestamps: Use CURRENT_TIMESTAMP ou NOW() para data/hora atual
💡 JSON: PostgreSQL suporta tipo jsonb para campos com estrutura flexível
💡 Arrays: Use ARRAY['val1', 'val2'] para campos tipo array
💡 Constraints: Trate erros de UNIQUE, FOREIGN KEY e CHECK constraints
💡 Bulk Insert: Para múltiplos registros, use EXECUTEQUERY com múltiplos VALUES
Próximo Node
→ POSTGRESQL UPDATE - Atualizar registros → POSTGRESQL DELETE - Deletar registros → POSTGRESQL INSERTORUPDATE - Upsert (Insert ou Update) → POSTGRESQL EXECUTEQUERY - Consultas personalizadas