Revisión de código para SQL
Se requieren evidencia de EXPLAIN y notas de rollback para las pull requests de PostgreSQL 18.4 - lista de verificación del revisor para migraciones, consultas ORM y SQL ad hoc en repositorios de aplicaciones.
Busca en todas las páginas de la documentación
Se requieren evidencia de EXPLAIN y notas de rollback para las pull requests de PostgreSQL 18.4 - lista de verificación del revisor para migraciones, consultas ORM y SQL ad hoc en repositorios de aplicaciones.
## Lista de verificación de revisión de PR de SQL (copiar en el comentario de revisión)
### Migraciones
- [ ] Versión única; el nombre del archivo tiene el ID del ticket
- [ ] Riesgo de bloqueo: bajo / medio / alto (Habilidad de seguridad de migración)
- [ ] CONCURRENTLY para índice de producción en tablas grandes
- [ ] SQL de rollback en db/rollback/ o cuerpo del PR
- [ ] Orden de despliegue: migración antes de la aplicación
### Consultas
- [ ] EXPLAIN (ANALYZE, BUFFERS) adjunto desde staging
- [ ] Sin regresión de escaneo secuencial en tablas grandes
- [ ] Consultas parametrizadas ($1 / binds nombrados)
- [ ] LIMIT en puntos finales de lista
### Seguridad
- [ ] Privilegio mínimo del rol (no superusuario)
- [ ] search_path establecido o nombres con prefijo de esquema
- [ ] Políticas RLS si la tabla es de inquilinoCuándo usar esto:
db/migrations/, *.sql, archivos de consulta del repositorioPR: Añadir método de repositorio findOpenOrdersByTenant.
El autor proporciona:
EXPLAIN (ANALYZE, BUFFERS)
SELECT id, total, created_at
FROM orders
WHERE tenant_id = $1 AND status = 'open'
ORDER BY created_at DESC
LIMIT 100;Index Scan using idx_orders_tenant_status on orders
Buffers: shared hit=120 read=4
Execution Time: 1.2 msEl revisor aprueba - el índice existe, LIMIT presente, buffers razonables.
Mal ejemplo de PR (rechazar):
SELECT * FROM orders WHERE tenant_id = $1 OR tenant_id = $2;
-- Sin EXPLAIN, sin LIMIT, OR previene el índice en algunos planificadoresPlantilla de comentario del revisor:
Solicitar cambios:
1. Adjuntar EXPLAIN (ANALYZE, BUFFERS) desde staging
2. Reemplazar OR con el patrón IN (...) o UNION ALL
3. Listar columnas explícitamente; eliminar SELECT *
4. Ver la Habilidad de Revisión EXPLAIN para la rúbrica de aprobación/rechazo| Señal | Aprobar | Solicitar cambios |
|---|---|---|
CREATE INDEX tabla grande | CONCURRENTLY archivo separado | Índice de transacción única |
NOT NULL columna nueva | expandir-contraer o ruta rápida de valor predeterminado de PG documentada | Riesgo de reescritura de tabla no explicado |
| Añadir FK | NOT VALID + VALIDATE dividido | Validación en línea en tabla enorme |
| Relleno de datos | UPDATE por lotes con commit | Transacción enorme única |
# MALO: N+1
for order in orders:
items = session.query(Item).filter_by(order_id=order.id).all()
# BUENO: evidencia de joinedload en el PR
orders = session.query(Order).options(joinedload(Order.items)).filter(...)-- rollback/V20260709_128__orders_priority_down.sql
DROP INDEX CONCURRENTLY IF EXISTS idx_orders_priority;
ALTER TABLE orders DROP COLUMN IF EXISTS priority;SET search_path = pg_catalog, app.pg_indexes en el PR.| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
| Sesión de emparejamiento | Primer PR de SQL para principiantes | Migración trivial rutinaria |
| sqlfluff/sql-lint automatizado | Estilo y anti-patrones obvios | Juicio de EXPLAIN |
| Horas de oficina de DBA | Equipo de alto volumen | Bloquear correcciones pequeñas |
Si la forma de la consulta no cambia y no es una ruta crítica, anote la exención. Cualquier cambio de filtro/unión/índice en una tabla grande requiere EXPLAIN.
Al menos un DBA o ingeniero de personal de la lista de rotación. Regla de dos personas para producción.
Sí para PII y volumen similar a producción. Las inicializaciones de desarrollo aún no deben usar patrones de superusuario que producción prohíbe.
Versiones de pila: Esta página fue escrita para PostgreSQL 18.4 y pilas de aplicaciones que utilizan migraciones Flyway 10+.
Revisado por Chris St. John·Última actualización: 16 jul 2026