- Folder Structure
. ├── cmd │ └── web │ └── main.go ├── config │ ├── driver.go │ ├── mysql.go │ └── sqlite.go ├── Docker-MySQL.md ├── go.mod ├── go.sum ├── handler │ └── album.go ├── Makefile ├── models │ ├── albums.go │ └── prepareDB.go ├── README.md ├── repository │ └── albumrepo.go └── router └── router.go
cmd/web/main.go
is entry point to run go application and define:- Initial Database connection
// sqlite config.DB = config.SqliteConn("foo.db") defer config.DB.Close() config.DB.Ping() models.PreparesqliteDB(config.DB)
- Run application
router := router.Router() router.Run()
- Initial Database connection
config/driver.go
is contained global pointer database connection*sql.DB
config/sqlite.go
andconfig/mysql.go
are define functionSqliteConn(f string) *sql.DB
return pointer database connectionrepository/albumrepo.go
defines anAlbumRepo interface
with methods:type AlbumRepo interface { Get() ([]models.Album, error) GetByID(id string) (models.Album, error) Create(title string, artist string, price float64) error Update(title string, artist string, price float64, id string) error Delete(id string) error }
models/albums.go
defines:- An Album table
type Album struct { ID int `json:"id"` Title string `json:"title"` Artist string `json:"artist"` Price float64 `json:"price"` }
- A struct for binding an client request body for an album
type RequestAlbum struct { Title string `json:"title"` Artist string `json:"artist"` Price float64 `json:"price"` }
- Using global pointer database connection
*sql.DB
fromconfig/driver.go
- Implementation all method of
AlbumRepo interface
func (al Album) Get() ([]models.Album, error) {} func (al Album) GetByID(id string) (models.Album, error) {} func (al Album) Create(title string, artist string, price float64) error {} func (al Album) Update(title string, artist string, price float64, id string) error {} func (al Album) Delete(id string) error {}
- An Album table
handler/album.go
defines:- An AlbumHandler struct with albumRepo is repository Album interface
type AlbumHandler struct { albumRepo repository.AlbumRepo }
- Define NewAlbumHandler function to return AlbumHandler object
func NewAlbumHandler() *AlbumHandler { return &AlbumHandler{ albumRepo: models.Album{}, } }
- Implementation all CRUD method on AlbumHandler and query database using
AlbumHandler.albumRepo
attributefunc (al AlbumHandler) Index(c *gin.Context) {} func (al AlbumHandler) Show(c *gin.Context) {} func (al AlbumHandler) Create(c *gin.Context) {} func (al AlbumHandler) Update(c *gin.Context) {} func (al AlbumHandler) Delete(c *gin.Context) {}
- An AlbumHandler struct with albumRepo is repository Album interface
router/router.go
defines:- Create a *gin.Engine
router := gin.New()
- Create an AlbumHandler
albumH := handler.NewAlbumHandler()
- Doing route base on url
router.GET("/albums", albumH.Index) router.GET("/albums/:id", albumH.Show) router.POST("/albums", albumH.Create) router.PUT("/albums/:id", albumH.Update) router.DELETE("/albums/:id", albumH.Delete)
- Create a *gin.Engine