Criar um banco de dados de tickets de suporte

CloudflareBeginner
Pratique Agora

Introdução

Uma equipe de suporte precisa de registros que possam ser filtrados e atualizados sem perder a identificação de cada ticket. O Cloudflare D1 é um banco de dados gerenciado que armazena informações relacionadas em tabelas e aceita SQL, uma linguagem usada para descrever os dados desejados. Uma tabela se parece com uma planilha: cada linha representa um ticket, e as colunas nomeadas armazenam seus campos.

Antes de iniciar este curso, conclua Connect LabEx to Your Cloudflare Account. Esse laboratório ensina a usar o terminal da VM do LabEx, autorizar o dispositivo, confirmar a conta e salvar o ID real da conta. Se você estiver entrando diretamente neste laboratório, faça aquele laboratório primeiro. Você também deve entender o básico de um Worker em JavaScript; não é necessário ter conhecimento de SQL.

Você criará um banco de dados, definirá regras para tickets válidos e distinguirá registros de prática locais dos registros na nuvem. Este laboratório precisa de um único banco de dados D1 descartável e não exige um Worker implantado.

Use sua própria conta de aprendizado e uma VM nova. A configuração prepara o Node.js 22.22.0 e, em seguida, executa npm install para instalar o Wrangler 4.131.1 localmente no projeto e quaisquer dependências de avaliação em /home/labex/project/ticket-database. As versões das dependências diretas são fixadas; a instalação cria seu próprio lockfile. Nenhum login na nuvem nem operação avaliada no banco de dados é executada durante a configuração. Em uma máquina pessoal, instale a mesma versão do Wrangler com npm install --save-dev wrangler@4.131.1 no seu projeto.

Este exercício usa pequenos registros sintéticos dentro das franquias gratuitas do D1. O uso existente da conta também é contabilizado nessas franquias. Nenhum domínio adquirido é necessário. Mantenha esta VM até confirmar a exclusão dos recursos e o logout.

Autorize esta VM e selecione a conta

Nesta etapa, você conectará este terminal novo à sua própria conta de aprendizado. Fazer login no Dashboard, por si só, não autoriza a VM. A permissão do D1 permite criar bancos de dados, alterar SQL e excluir bancos de dados. Revise a página de consentimento real, incluindo Background Access, antes de autorizar.

Abra o projeto preparado e verifique a versão fixada da CLI:

cd /home/labex/project/ticket-database
npx wrangler --version

O resultado esperado é 4.131.1. Inicie a autorização do dispositivo; --device exibe um código para o navegador, e --browser=false permite que você escolha como abrir o navegador:

npx wrangler login --device --browser=false --scopes account:read user:read d1:write

Abra a URL exibida no navegador, informe o código atual, confirme sua conta de aprendizado e as permissões e autorize o acesso. Aguarde a confirmação de sucesso no terminal. Nunca cole senhas ou tokens nos arquivos do projeto.

Lista de permissões para autorização do D1

Este exemplo mostra D1 Write junto com o acesso à conta e o acesso em segundo plano obrigatório. Confirme sua própria conta de aprendizado selecionada antes de autorizar.

npx wrangler whoami --json

Verifique loggedIn: true e leia o name e o id da conta, mesmo quando apenas uma conta estiver listada. Copie o ID desejado para a configuração abaixo. A variável de shell a seguir usa 6 bytes aleatórios, ou 12 caracteres hexadecimais, para evitar colisões com outros alunos. Um here-document grava o JSON entre as linhas JSON; $RUN é expandido dentro dele.

A barra invertida antes de $schema mantém essa chave JSON literal; $RUN continua sendo expandido para o nome único desta execução.

RUN=labex-c04-d01-$(openssl rand -hex 6)
cat > wrangler.jsonc <<JSON
{
  "\$schema": "./node_modules/wrangler/config-schema.json",
  "name": "$RUN",
  "account_id": "YOUR_ACCOUNT_ID",
  "main": "src/index.js",
  "compatibility_date": "2026-09-15",
  "workers_dev": true,
  "preview_urls": false
}
JSON

Substitua YOUR_ACCOUNT_ID antes de executar o bloco. Mantenha este terminal aberto para que RUN continue disponível. name identifica esta execução; account_id seleciona a conta usada nas operações na nuvem. O arquivo é um JSON comum, que também é um JSONC válido. Escrever esse arquivo não implanta nenhum Worker.

Crie uma tabela local de tickets

Nesta etapa, você definirá um schema: as colunas e regras impostas pelo banco de dados. Primeiro, crie o contêiner na nuvem e sua binding, mas mantenha as primeiras alterações SQL apenas localmente.

Crie um banco de dados descartável na nuvem. --binding DB fornece ao código da aplicação um nome curto, --update-config registra o nome real e o UUID em wrangler.jsonc, e --use-remote=false mantém o desenvolvimento local:

npx wrangler d1 create "$RUN-db" --binding DB --update-config --use-remote=false

Leia o nome e o ID criados e, em seguida, verifique a binding salva:

cat wrangler.jsonc

A entrada DB deve indicar o banco de dados desta execução. Uma binding é uma conexão configurada entre o código e um recurso. O UUID identifica o banco de dados na nuvem, enquanto --local usa um banco de dados SQLite separado nesta VM. Sempre inclua --local ou --remote nos comandos SQL.

CREATE TABLE define uma tabela. INTEGER PRIMARY KEY fornece a cada linha uma identidade numérica exclusiva. TEXT armazena strings. NOT NULL impede valores ausentes, e CHECK rejeita valores que estejam fora da regra. DEFAULT fornece um valor quando um INSERT não informa aquele campo. Essas verificações ajudam a evitar tickets incompletos.

Grave o schema e duas linhas sintéticas em um arquivo SQL. O marcador SQL entre aspas impede que o shell interprete o conteúdo. As instruções SQL terminam com ponto e vírgula. INSERT INTO associa os nomes das colunas aos valores de cada linha:

cat > schema.sql <<'SQL'
CREATE TABLE tickets (
  id INTEGER PRIMARY KEY,
  subject TEXT NOT NULL CHECK(length(trim(subject)) > 0),
  status TEXT NOT NULL DEFAULT 'open' CHECK(status IN ('open','closed')),
  source TEXT NOT NULL
);
INSERT INTO tickets (id, subject, status, source) VALUES
  (1, 'Cannot sign in', 'open', 'seed'),
  (2, 'Invoice copy', 'closed', 'seed');
SQL

Aplique o arquivo somente ao banco de dados local:

npx wrangler d1 execute DB --local --file schema.sql

Um comando bem-sucedido informa que a execução ocorreu no banco de dados local. Isso não comprova que exista uma tabela remota. Inspecione as definições das colunas usando o PRAGMA table_info do SQLite:

npx wrangler d1 execute DB --local --command "PRAGMA table_info(tickets);"

O resultado esperado inclui id, subject, status e source. O campo pk identifica a chave primária, enquanto notnull registra os valores obrigatórios.

Filtre, atualize e remova linhas locais

Nesta etapa, você praticará SQL básico e deixará um marcador somente local. SELECT escolhe as colunas, FROM identifica uma tabela, WHERE filtra as linhas correspondentes e ORDER BY torna a ordem previsível.

npx wrangler d1 execute DB --local --command "SELECT id, subject FROM tickets WHERE status = 'open' ORDER BY id;"

O resultado é o ticket 1, Cannot sign in. As strings SQL usam aspas simples dentro das aspas duplas do comando. Adicione um ticket local de prática:

npx wrangler d1 execute DB --local --command "INSERT INTO tickets (id, subject, source) VALUES (3, 'Local rehearsal', 'local');"

UPDATE altera as linhas correspondentes. Sempre leia a condição WHERE antes da execução: se ela fosse omitida, todas as linhas seriam alteradas.

npx wrangler d1 execute DB --local --command "UPDATE tickets SET status = 'closed' WHERE id = 3;"

Tente usar um status inválido para ver a restrição protegendo os dados:

npx wrangler d1 execute DB --local --command "UPDATE tickets SET status = 'lost' WHERE id = 3;"

Este comando deve falhar intencionalmente. Espere uma mensagem CHECK constraint failed, não uma falha de autenticação ou de rede. A linha continua com o status closed. Crie e depois exclua uma linha descartável; DELETE remove apenas as linhas que correspondem ao seu predicado:

npx wrangler d1 execute DB --local --command "INSERT INTO tickets (id, subject, source) VALUES (4, 'Temporary', 'local'); DELETE FROM tickets WHERE id = 4;"

Leia as linhas restantes:

npx wrangler d1 execute DB --local --command "SELECT id, subject, status, source FROM tickets ORDER BY id;"

O resultado esperado contém os IDs 1, 2 e 3; o ticket 3 está closed e tem origem local. O ticket 4 não aparece. A atualização que falhou não deve ter alterado a linha válida.

Popule e inspecione o banco de dados remoto

Nesta etapa, você aplicará o mesmo schema ao banco de dados na nuvem e comprovará que as alterações locais não foram aplicadas automaticamente. --remote envia estas instruções SQL ao banco de dados identificado pelo UUID na conta selecionada.

npx wrangler d1 execute DB --remote --file schema.sql

Se for solicitado, confirme apenas o banco de dados deste laboratório. Adicione uma linha exclusiva do ambiente remoto com o mesmo ID da linha de prática local, mas com dados diferentes:

npx wrangler d1 execute DB --remote --command "INSERT INTO tickets (id, subject, source) VALUES (3, 'Cloud inbox', 'remote');"

Leia explicitamente os dois destinos:

npx wrangler d1 execute DB --remote --command "SELECT id, subject, status, source FROM tickets ORDER BY id;"
npx wrangler d1 execute DB --local --command "SELECT id, subject, status, source FROM tickets ORDER BY id;"

O ticket remoto 3 é Cloud inbox, open, remote; o ticket local 3 continua sendo Local rehearsal, closed, local. Essa diferença comprova que você escolheu o destino correto.

No Cloudflare Dashboard, selecione a mesma conta e abra Storage & databases → D1 SQLite Database. Encontre o nome exato do banco de dados desta execução e abra a página de detalhes. Compare o ID do banco de dados com o valor em wrangler.jsonc. Use a visualização de tabela somente leitura, se estiver disponível, para inspecionar tickets. Não crie nem edite registros nessa página. As respostas SQL acima estabelecem o conteúdo das linhas; uma contagem atrasada em Metrics não estabelece esse conteúdo.

Execute a verificação desta etapa antes de excluir o banco de dados.

D1 tickets in Studio

Abra Explore Data e selecione tickets no Studio. Inspecione as linhas sem editá-las. O nome aleatório do banco no exemplo pertence a uma execução de teste; o seu será diferente. O ticket 3 é Cloud inbox com origem remote, enquanto o banco local ainda contém Local rehearsal com origem local.

Exclua os recursos descartáveis

Nesta etapa, você removerá apenas os recursos deste laboratório enquanto a VM ainda estiver autorizada. Conclua primeiro todas as verificações funcionais. Mantenha a configuração até concluir a verificação da exclusão.

npx wrangler d1 delete DB

Leia o prompt e confirme apenas o banco de dados desta execução. Em seguida, liste os bancos de dados:

npx wrangler d1 list --json

O nome e o UUID do banco de dados registrados por você devem estar ausentes em uma resposta bem-sucedida. Outros recursos podem permanecer. Um erro de autenticação ou de rede é inconclusivo: resolva o problema de acesso e repita a leitura antes de continuar. Execute a verificação desta etapa enquanto ainda estiver conectado.

Encerre a autorização desta VM

Nesta etapa, você encerrará a autorização somente depois que a verificação independente da exclusão for aprovada. O logout remove a autorização armazenada do Wrangler nesta VM; fechar uma VM, por si só, não faz a limpeza na nuvem.

npx wrangler logout
npx wrangler whoami --json

O resultado esperado é loggedIn: false. Essa consulta sem autenticação pode terminar com um código diferente de zero; isso só é esperado quando a resposta estruturada indicar explicitamente que você saiu da sessão. Conclua a verificação e depois feche o ambiente do laboratório.

Resumo

Você praticou a criação de um banco de dados de tickets de suporte. Verificou resultados observáveis do banco de dados, manteve explícitos a conta selecionada e o estado local e removeu os recursos descartáveis antes de sair da sessão.