Saltar al contenido principal

Visualizando tu Grafo de Datos con entviz

· 5 min de lectura
[Traducción Beta No Oficial]

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Incorporarse a un proyecto existente con una base de código extensa puede ser una tarea abrumadora.

Comprender el modelo de datos de una aplicación es fundamental para que los desarrolladores puedan empezar a trabajar en un proyecto existente. Una herramienta comúnmente utilizada para superar este desafío y ayudar a los desarrolladores a entender el modelo de datos de una aplicación es un diagrama ER (Entidad-Relación).

Los diagramas ER proporcionan una representación visual de tu modelo de datos y detallan cada campo de las entidades. Muchas herramientas pueden ayudar a crearlos, como por ejemplo Jetbrains DataGrip, que puede generar un diagrama ER conectándose e inspeccionando una base de datos existente:

Datagrip ER diagram

DataGrip ER diagram example

Ent, un framework de entidades simple pero potente para Go, fue desarrollado originalmente dentro de Facebook específicamente para manejar proyectos con modelos de datos grandes y complejos. Por eso Ent utiliza generación de código: proporciona seguridad de tipos y autocompletado de código desde el primer momento, lo que ayuda a explicar el modelo de datos y mejora la velocidad de desarrollo. Además de todo esto, ¿no sería genial generar automáticamente diagramas ER que mantengan una visión de alto nivel del modelo de datos en una representación visualmente atractiva? (Vamos, ¿a quién no le gustan las visualizaciones?)

Presentando entviz

entviz es una extensión de ent que genera automáticamente una página HTML estática que visualiza tu grafo de datos.

Entviz example output

Entviz example output

La mayoría de herramientas para generar diagramas ER necesitan conectarse a tu base de datos e inspeccionarla, lo que dificulta mantener un diagrama actualizado del esquema de la base de datos. Como entviz se integra directamente con tu esquema de Ent, no necesita conectarse a tu base de datos y genera automáticamente una visualización fresca cada vez que modificas tu esquema.

Si quieres saber más sobre cómo se implementó entviz, echa un vistazo a la sección de implementación.

Verlo en acción

Primero, añadamos la extensión entviz a nuestro archivo entc.go:

go get github.com/hedwigz/entviz
información

Si no estás familiarizado con entc, te invitamos a leer la documentación de entc para aprender más sobre ello.

ent/entc.go
import (
"log"

"entgo.io/ent/entc"
"entgo.io/ent/entc/gen"
"github.com/hedwigz/entviz"
)

func main() {
err := entc.Generate("./schema", &gen.Config{}, entc.Extensions(entviz.Extension{}))
if err != nil {
log.Fatalf("running ent codegen: %v", err)
}
}

Supongamos que tenemos un esquema simple con una entidad de usuario y algunos campos:

ent/schema/user.go
// Fields of the User.
func (User) Fields() []ent.Field {
return []ent.Field{
field.String("name"),
field.String("email"),
field.Time("created").
Default(time.Now),
}
}

Ahora, entviz generará automáticamente una visualización de nuestro grafo cada vez que ejecutemos:

go generate ./...

Deberías ver ahora un nuevo archivo llamado schema-viz.html en tu directorio de ent:

$ ll ./ent/schema-viz.html
-rw-r--r-- 1 hedwigz hedwigz 7.3K Aug 27 09:00 schema-viz.html

Abre el archivo html con tu navegador favorito para ver la visualización

tutorial image

A continuación, añadamos otra entidad llamada Post y veamos cómo cambia nuestra visualización:

ent new Post
ent/schema/post.go
// Fields of the Post.
func (Post) Fields() []ent.Field {
return []ent.Field{
field.String("content"),
field.Time("created").
Default(time.Now),
}
}

Ahora añadimos una relación (O2M) de User a Post:

ent/schema/post.go
// Edges of the User.
func (User) Edges() []ent.Edge {
return []ent.Edge{
edge.To("posts", Post.Type),
}
}

Finalmente, regeneramos el código:

go generate ./...

¡Actualiza tu navegador para ver el resultado actualizado!

tutorial image 2

Implementación

Entviz se implementó extendiendo ent mediante su API de extensiones. La API de extensiones de Ent permite combinar múltiples plantillas, hooks, opciones y anotaciones. Por ejemplo, entviz utiliza plantillas para añadir otro archivo Go, entviz.go, que expone el método ServeEntviz que puede usarse como manejador HTTP de la siguiente forma:

func main() {
http.ListenAndServe("localhost:3002", ent.ServeEntviz())
}

Definimos una estructura de extensión que incorpora la extensión por defecto, y exportamos nuestra plantilla mediante el método Templates:

//go:embed entviz.go.tmpl
var tmplfile string

type Extension struct {
entc.DefaultExtension
}

func (Extension) Templates() []*gen.Template {
return []*gen.Template{
gen.MustParse(gen.NewTemplate("entviz").Parse(tmplfile)),
}
}

El archivo de plantilla contiene el código que queremos generar:

{{ define "entviz"}}

{{ $pkg := base $.Config.Package }}
{{ template "header" $ }}
import (
_ "embed"
"net/http"
"strings"
"time"
)

//go:embed schema-viz.html
var html string

func ServeEntviz() http.Handler {
generateTime := time.Now()
return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
http.ServeContent(w, req, "schema-viz.html", generateTime, strings.NewReader(html))
})
}
{{ end }}

¡Y eso es todo! Ahora tenemos un nuevo método en el paquete ent.

Resumen final

Hemos visto cómo los diagramas ER ayudan a los desarrolladores a mantener el control de su modelo de datos. Luego presentamos entviz, una extensión de Ent que genera automáticamente diagramas ER para esquemas de Ent. Observamos cómo entviz utiliza la API de extensiones de Ent para ampliar la generación de código y añadir funcionalidad adicional. Finalmente, has podido verlo en acción instalando y usando entviz en tu propio proyecto. Si te gusta el código y/o quieres contribuir, no dudes en revisar el proyecto en GitHub.

¿Tienes preguntas? ¿Necesitas ayuda para empezar? Únete a nuestro servidor de Discord o canal de Slack.

[Para más noticias y actualizaciones de Ent:]