- Introduced "Minhas Intenções" tab visible only to logged-in users. - Integrated MyPurchaseIntentionsPanel and useMyPurchaseIntentions hook. - Added tab badge showing count of pending intentions. - Extended session API to include user’s main character for downstream features.
291 lines
7.4 KiB
Markdown
291 lines
7.4 KiB
Markdown
# 📊 Prisma Query Logs - Explicação Completa
|
|
|
|
## 🔍 O que são os logs `prisma:query`?
|
|
|
|
Os logs `prisma:query` são **queries SQL que o Prisma executa automaticamente** no banco de dados PostgreSQL. Eles aparecem no console durante o desenvolvimento para ajudar você a:
|
|
|
|
1. **Debugar** - Ver exatamente quais queries estão sendo executadas
|
|
2. **Otimizar** - Identificar queries lentas ou desnecessárias
|
|
3. **Entender** - Compreender o que o Prisma está fazendo "por baixo dos panos"
|
|
|
|
---
|
|
|
|
## ⚙️ Configuração Atual
|
|
|
|
No arquivo `lib/prisma/app.ts`, o Prisma está configurado assim:
|
|
|
|
```typescript
|
|
export const prisma = new PrismaClient({
|
|
log:
|
|
process.env.NODE_ENV === "development"
|
|
? ["query", "error", "warn"] // ← Loga queries em desenvolvimento
|
|
: ["error"], // ← Apenas erros em produção
|
|
});
|
|
```
|
|
|
|
**Isso significa:**
|
|
- ✅ **Em desenvolvimento**: Mostra todas as queries SQL
|
|
- ✅ **Em produção**: Apenas mostra erros (não mostra queries)
|
|
|
|
---
|
|
|
|
## 📝 Análise dos Logs do Seu Terminal
|
|
|
|
### 1. **INSERT de Telemetria** (Linhas 24-26, 58-59, 93-94)
|
|
|
|
```sql
|
|
INSERT INTO "public"."telemetry_events"
|
|
("event_type","ad_id","user_id","session_id","metadata","timestamp")
|
|
VALUES ($1,$2,$3,$4,$5,$6)
|
|
RETURNING ...
|
|
```
|
|
|
|
**O que é:**
|
|
- Registra eventos de telemetria (cliques, visualizações, etc.)
|
|
- Executado quando o usuário interage com a página
|
|
|
|
**Por que aparece:**
|
|
- O sistema de telemetria está ativo e registrando eventos
|
|
|
|
---
|
|
|
|
### 2. **SELECT de Listings** (Linhas 35-36, 79-80)
|
|
|
|
```sql
|
|
SELECT COUNT(*) AS "_count$_all"
|
|
FROM (SELECT "public"."listings"."listing_id"
|
|
FROM "public"."listings"
|
|
WHERE "public"."listings"."listing_status" = $1
|
|
OFFSET $2) AS "sub"
|
|
```
|
|
|
|
**O que é:**
|
|
- Conta quantos anúncios ativos existem
|
|
- Usado para paginação
|
|
|
|
**E depois:**
|
|
|
|
```sql
|
|
SELECT "public"."listings"."listing_id",
|
|
"public"."listings"."seller_id",
|
|
"public"."listings"."item_id",
|
|
-- ... todos os campos ...
|
|
FROM "public"."listings"
|
|
WHERE "public"."listings"."listing_status" = $1
|
|
ORDER BY "public"."listings"."created_at" DESC
|
|
LIMIT $2 OFFSET $3
|
|
```
|
|
|
|
**O que é:**
|
|
- Busca os anúncios ativos com paginação
|
|
- Ordena por data de criação (mais recentes primeiro)
|
|
- Limita a 20 resultados por página
|
|
|
|
**Por que aparece:**
|
|
- A página do marketplace (`/en/market`) está carregando
|
|
- Está buscando anúncios para exibir
|
|
|
|
---
|
|
|
|
### 3. **SELECT de Characters** (Linhas 37, 81)
|
|
|
|
```sql
|
|
SELECT "public"."user_characters"."character_id",
|
|
"public"."user_characters"."user_id",
|
|
"public"."user_characters"."character_name",
|
|
"public"."user_characters"."server_name",
|
|
"public"."user_characters"."is_main",
|
|
"public"."user_characters"."verified",
|
|
"public"."user_characters"."created_at"
|
|
FROM "public"."user_characters"
|
|
WHERE ("public"."user_characters"."user_id" = $1
|
|
AND "public"."user_characters"."server_name" = $2
|
|
AND "public"."user_characters"."is_main" = $3)
|
|
LIMIT $4 OFFSET $5
|
|
```
|
|
|
|
**O que é:**
|
|
- Busca o personagem principal do vendedor
|
|
- Usado para exibir o nome do personagem nos cards de anúncio
|
|
|
|
**Por que aparece:**
|
|
- Para cada anúncio, busca o nome do personagem do vendedor
|
|
- Isso acontece porque implementamos a busca de `seller_character_name`
|
|
|
|
---
|
|
|
|
### 4. **SELECT de Servers** (Linha 66)
|
|
|
|
```sql
|
|
SELECT "public"."servers"."server_id",
|
|
"public"."servers"."server_name",
|
|
-- ... outros campos ...
|
|
FROM "public"."servers"
|
|
WHERE "public"."servers"."is_active" = $1
|
|
ORDER BY "public"."servers"."server_name" ASC
|
|
OFFSET $2
|
|
```
|
|
|
|
**O que é:**
|
|
- Busca todos os servidores ativos
|
|
- Usado para popular o filtro de servidores no marketplace
|
|
|
|
**Por que aparece:**
|
|
- O componente de filtros está carregando a lista de servidores
|
|
|
|
---
|
|
|
|
### 5. **BEGIN / COMMIT** (Linhas 23, 27, 57, 60, 92, 95)
|
|
|
|
```sql
|
|
BEGIN
|
|
-- ... queries ...
|
|
COMMIT
|
|
```
|
|
|
|
**O que é:**
|
|
- **Transações** do banco de dados
|
|
- Garante que múltiplas operações sejam executadas atomicamente
|
|
- Se uma falhar, todas são revertidas (ROLLBACK)
|
|
|
|
**Por que aparece:**
|
|
- Operações que precisam de atomicidade (ex: inserir múltiplos eventos de telemetria em batch)
|
|
|
|
---
|
|
|
|
## 🎯 Por que isso é útil?
|
|
|
|
### ✅ Benefícios:
|
|
|
|
1. **Debugging:**
|
|
- Ver exatamente quais queries estão sendo executadas
|
|
- Identificar queries N+1 (muitas queries desnecessárias)
|
|
- Verificar se os índices estão sendo usados
|
|
|
|
2. **Performance:**
|
|
- Identificar queries lentas
|
|
- Ver quantas queries estão sendo executadas
|
|
- Otimizar queries que são executadas repetidamente
|
|
|
|
3. **Entendimento:**
|
|
- Aprender como o Prisma traduz suas operações para SQL
|
|
- Ver como os relacionamentos são resolvidos
|
|
|
|
---
|
|
|
|
## ⚙️ Como Controlar os Logs
|
|
|
|
### Opção 1: Desabilitar completamente (não recomendado em dev)
|
|
|
|
```typescript
|
|
// lib/prisma/app.ts
|
|
export const prisma = new PrismaClient({
|
|
log: ["error"], // Apenas erros
|
|
});
|
|
```
|
|
|
|
### Opção 2: Apenas erros e warnings
|
|
|
|
```typescript
|
|
export const prisma = new PrismaClient({
|
|
log: ["error", "warn"],
|
|
});
|
|
```
|
|
|
|
### Opção 3: Logs mais detalhados (com informações de tempo)
|
|
|
|
```typescript
|
|
export const prisma = new PrismaClient({
|
|
log: [
|
|
{ level: "query", emit: "event" },
|
|
{ level: "error", emit: "stdout" },
|
|
{ level: "warn", emit: "stdout" },
|
|
],
|
|
});
|
|
```
|
|
|
|
### Opção 4: Manter como está (recomendado)
|
|
|
|
```typescript
|
|
// Atual (já está assim)
|
|
export const prisma = new PrismaClient({
|
|
log:
|
|
process.env.NODE_ENV === "development"
|
|
? ["query", "error", "warn"] // ← Bom para desenvolvimento
|
|
: ["error"], // ← Otimizado para produção
|
|
});
|
|
```
|
|
|
|
**✅ Recomendação:** Manter como está! Os logs são úteis em desenvolvimento e não aparecem em produção.
|
|
|
|
---
|
|
|
|
## 🔍 Análise de Performance dos Seus Logs
|
|
|
|
### Queries que aparecem frequentemente:
|
|
|
|
1. **SELECT listings** (2 queries):
|
|
- Uma para contar total
|
|
- Uma para buscar os itens
|
|
- **Status:** ✅ Normal (paginação requer ambas)
|
|
|
|
2. **SELECT user_characters** (1 por anúncio):
|
|
- Busca o personagem do vendedor
|
|
- **Status:** ⚠️ Potencial otimização
|
|
- **Sugestão:** Já está otimizado com `Map` para evitar queries duplicadas
|
|
|
|
3. **INSERT telemetry_events** (em batch):
|
|
- Múltiplos eventos inseridos em uma transação
|
|
- **Status:** ✅ Otimizado (usa transação)
|
|
|
|
---
|
|
|
|
## 📊 Níveis de Log do Prisma
|
|
|
|
O Prisma suporta diferentes níveis de log:
|
|
|
|
```typescript
|
|
log: [
|
|
"query", // Todas as queries SQL
|
|
"info", // Informações gerais
|
|
"warn", // Avisos
|
|
"error", // Erros
|
|
]
|
|
```
|
|
|
|
**Ou com eventos:**
|
|
|
|
```typescript
|
|
log: [
|
|
{ level: "query", emit: "event" }, // Evento customizado
|
|
{ level: "error", emit: "stdout" }, // Console padrão
|
|
]
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Conclusão
|
|
|
|
**Os logs `prisma:query` são:**
|
|
- ✅ **Normais** - Esperados em desenvolvimento
|
|
- ✅ **Úteis** - Ajudam a debugar e otimizar
|
|
- ✅ **Automáticos** - Não afetam performance
|
|
- ✅ **Desabilitados em produção** - Não aparecem em produção
|
|
|
|
**Você deve:**
|
|
- ✅ **Manter** os logs em desenvolvimento
|
|
- ✅ **Usar** para identificar problemas de performance
|
|
- ✅ **Ignorar** se não estiver debuggando (são apenas informativos)
|
|
|
|
---
|
|
|
|
## 🔗 Referências
|
|
|
|
- [Prisma Logging Documentation](https://www.prisma.io/docs/concepts/components/prisma-client/working-with-prismaclient/logging)
|
|
- [Prisma Query Performance](https://www.prisma.io/docs/guides/performance-and-optimization/query-optimization-performance)
|
|
|
|
|
|
|
|
|
|
|