En está sección se realiza paso a paso la creación de una API con el framework Beego
Repositorio: test_api_crud
- Instalación Golang
- Instalación Beego y Bee
- Instalación Postgres
- Instalación pgAdmin3
- Instalación pgModeler
sudo su postgres
# Crear bd
createdb bd_oas
# o
psql -c "CREATE DATABASE bd_oas;"
# listar las bd
psql -c "\l"
# para eliminar db
dropdb dbjota
Ejecutar el sql adjunto
psql -U postgres -d bd_oas -a -f usuario_rol.sql
Puedes exportar el modelo dbm desde en pgModeler
Los proyecto en el lenguaje goolang see acostumbran almacenar en el directorio $GOPATH seguido de un directorio con nombre del sistema de control de versiones, en este caso gihub y luego del usuario propietario del repositorio, es por eso que a continuación creamos el directorio de la siguiente forma.
# Cuando instalaste beego se creo el directorio src/github
# cd $GOPATH/src
# ls
# github.com
cd ~/go/src/github.com/ && mkdir TuUsuarioGithub
Ingrer al directorio
cd ~/go/src/github.com/TuUsuarioGithub
Usamos el framework beego para crear el api
# bee api test_api -driver=postgres -conn=postgres://MyUsuarioBD:MyPassDB@127.0.0.1/bd_oas?sslmode=disable
# Ejemplo:
bee api test_api -driver=postgres -conn="postgres://postgres:1234@127.0.0.1/bd_oas?sslmode=disable"
Se Creara un directorio llamado test_api con los archivo correspondiente a la api.
├── conf
│ └── app.conf
├── controllers
│ ├── rol.go
│ └── usuario.go
├── main.go
├── models
│ ├── rol.go
│ └── usuario.go
├── routers
│ └── router.go
└── tests
Para esto, editamos el archivo test_api/conf/app.conf
agregar lo siguiente:
&search_path=nombre_de_tu_schema
Código Original:
sqlconn = postgres://postgres:postgres@127.0.0.1/bd_oas?sslmode=disable
Código incorporando configuración:
sqlconn = postgres://postgres:postgres@127.0.0.1/bd_oas?sslmode=disable&search_path=public
En el archivo test_api/models/usuario.go
Código original:
type Usuario struct {
Id int `orm:"column(id);pk"`
Nombre string `orm:"column(nombre)"`
Apellido string `orm:"column(apellido);null"`
}
Código incorporando configuración:
type Usuario struct {
Id int `orm:"column(id);pk;auto"`
Nombre string `orm:"column(nombre)"`
Apellido string `orm:"column(apellido);null"`
}
Esta configuración permitirá que los servicios sean consumibles desde un navegador web.
Editar el archivo main.go
Código original:
func main() {
orm.RegisterDataBase("default", "postgres", beego.AppConfig.String("sqlconn"))
if beego.BConfig.RunMode == "dev" {
beego.BConfig.WebConfig.DirectoryIndex = true
beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
}
beego.Run()
}
"github.com/astaxie/beego/plugins/cors"
beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
AllowOrigins: []string{"*"},
AllowMethods: []string{"PUT", "PATCH", "GET", "POST", "OPTIONS", "DELETE"},
AllowHeaders: []string{"Origin", "x-requested-with",
"content-type",
"accept",
"origin",
"authorization",
"x-csrftoken"},
ExposeHeaders: []string{"Content-Length"},
AllowCredentials: true,
}))
Si le interesa ver en el log de la api las consultas SQL que realiza, agregar al inicio del main
la siguiente linea:
orm.Debug = true
Código incorporando configuración:
Al final tendremos la funcion main
de la siguieten forma:
func main() {
orm.Debug = true
orm.RegisterDataBase("default", "postgres", beego.AppConfig.String("sqlconn"))
if beego.BConfig.RunMode == "dev" {
beego.BConfig.WebConfig.DirectoryIndex = true
beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
}
beego.InsertFilter("*", beego.BeforeRouter, cors.Allow(&cors.Options{
AllowOrigins: []string{"*"},
AllowMethods: []string{"PUT", "PATCH", "GET", "POST", "OPTIONS", "DELETE"},
AllowHeaders: []string{"Origin", "x-requested-with",
"content-type",
"accept",
"origin",
"authorization",
"x-csrftoken"},
ExposeHeaders: []string{"Content-Length"},
AllowCredentials: true,
}))
beego.Run()
}
En el archivo ./models/rol.go
debemos especificar la funcion RelatedSel()
que en modelo de BD es la llave foranea (FK).
Código original
func GetAllRol(query map[string]string, fields []string, sortby []string, order []string,
offset int64, limit int64) (ml []interface{}, err error) {
o := orm.NewOrm()
qs := o.QueryTable(new(Rol))
...
Código incorporando configuración RelatedSel()
func GetAllRol(query map[string]string, fields []string, sortby []string, order []string,
offset int64, limit int64) (ml []interface{}, err error) {
o := orm.NewOrm()
qs := o.QueryTable(new(Rol)).RelatedSel()
...
Ubicado en la raíz del proyecto
cd ~/go/src/github.com/TuUsuarioGithub/test_api
Ejecutra
bee run
Ejecutra y Generar Documentación
bee run -downdoc=true -gendoc=true
# Entidad Usuario: Abrir navegador he ingresar a:
127.0.0.1:8080/v1/usuario
# Entidad Rol: Abrir navegador he ingresar a:
127.0.0.1:8080/v1/rol
# Abrir navegador he ingresar
127.0.0.1:8080/swagger/