main.go
Una de las bases de datos más populares en la actualidad es Mongo sin embargo es más conocida en el mundo de JavaScript en Go las bases de datos que suelen utilizarse son PostgreSQL y MySQL, en este artículo aprenderemos como conectarnos a una base de datos de Mongo desde Go.
Para este tutorial organizaremos nuestras fuentes de datos en la carpeta repositorios. Los demás archivos estarán ubicados en su posición normal.
config
config.go
repositories
mongo.go
config.json
.gitignore
go.mod
main.go
Dentro de la carpeta repositorio estaría también la conexión con Redis si la tuviésemos o a una base de datos relacional como MySQL.
En un siguiente artículo entraremos más a detalle haciendo un CRUD con Go, Fiber y Mongo.
💡Tip: Al empezar un proyecto nuevo en Go
go mod init github.com/tuUsuario/elNombreDeTuCarpeta
Con Mongo tenemos la opción de conectarnos usando un URL, dentro de este vienen distintos parámetros como usuario, contraseña, servidor, etc.
Podemos abordar el archivo de configuración usando los distintos parámetros por separado o usando solo la URL de conexión.
Para este artículo usaremos solo la URL para simplificar lo más que podamos y concentrarnos en realizar la conexión.
~{ "mongo_conn": "https://🤫.com" }
Para este ejemplo usaremos nuestro servicio de configuración explicado en el artículo donde aprendemos a traer variables de configuración desde archivos JSON.
~package config import ( "encoding/json" "os" ) type Config struct { MongoConn string `json:"mongo_conn"` } type ConfigService struct { Config Config FilePath string } func (s *Service) GetMongoConn() string { return s.Config.MongoConn } func (s *ConfigService) LoadConfigJSON() error { configuration := Config{} configFile, err := os.Open("./config.json") if err != nil { return err } jsonParser := json.NewDecoder(configFile) if err = jsonParser.Decode(&configuration); err != nil { return err } s.Config = configuration return nil } func NewConfigService(path string ) *Service { return &Service{ FilePath:path, } }
Primero instalemos el Mongo Driver que es el paquete oficial de Mongo.
~go get go.mongodb.org/mongo-driver/mongo
Una buena forma de empezar la conexión a Mongo es al momento de crear la instancia de este repositorio Mongo en el código podrás ver como en la función creadora se inicializa la conexión hacia Mongo.
~package repositories import ( "context" "time" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/mongo/readpref" ) type MongoHandler struct { Client *mongo.Client Config *config.ConfigService } func NewMongoHandler(config config.ConfigService) *MongoHandler{ ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() client, err := mongo.Connect(ctx, options.Client().ApplyURI(config.GetMongoConn())) return &MongoHandler{ Client: client, Config: config, } func (m *MongoHandler) CheckConnection() { err := client.Ping(ctx, readpref.Primary()) if err != nil { panic(err) } } func (m *MongoHandler) Disconnect() { err := client.Disconnect(ctx); if err != nil { panic(err) } }
Ahora podremos usar nuestra base de datos en otros servicios por ahora comprobaremos la conexión en main.go
~package main import ( "github.com/solrac97gr/go-mongo-conn/config" "github.com/solrac97gr/go-mongo-conn/repositories" ) func main() { configService := config.NewConfigService("./config.json") mongoHandler := repositories.NewMongoHandler(configService) defer mongoHandler.Disconnect() mongoHandler.CheckConnection() }
Podemos crear distintos bases de datos de esta forma creando una interfaz que indique que cada base de datos debe tener los métodos Disconnect y CheckConnection y usar todos los métodos que necesitamos para que así nuestros servicios puedan cambiar de base de datos de manera modular.