Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mysql database gets error in golang 【sql: database is closed】

Tags:

mysql

go

I try to set up mysql database in golang.
I created db.go for mysql setting up and import it to main.go.
But when I run main.go, error occurs because of db.go.
I want to resolve this error.

There is no compile error.
But when running go run main.go, error occurs.

main.go

package main

// import

func main() {
    err := godotenv.Load()
    if err != nil {
    }
    db := db.NewDatabase(os.Getenv("MYSQL_USER"), os.Getenv("MYSQL_PASSWORD"), os.Getenv("MYSQL_HOST"))
    s3 := s3.NewS3(os.Getenv("AWS_ACCESS_KEY_ID"), os.Getenv("AWS_SECRET_ACCESS_KEY"))
    dao := dao.NewDao(db.DATABASE, s3)
    service := service.NewService(dao)
    cntlr := controller.NewController(service)

    router := gin.Default()

    router.Use(cors.New(cors.Config{
        AllowOrigins:     []string{"*"},
        AllowMethods:     []string{"GET", "POST", "OPTIONS"},
        AllowHeaders:     []string{"Content-Type", "Content-Length", "Accept-Encoding", "X-CSRF-Token", "Authorization", "accept", "origin", "Cache-Control", "X-Requested-With"},
        ExposeHeaders:    []string{"Content-Length"},
        AllowCredentials: true,
        AllowOriginFunc: func(origin string) bool {
            return true
        },
        MaxAge: 15 * time.Second,
    }))

    api := router.Group("/api")
    {
        api.GET("/articles", func(c *gin.Context) {
            cntlr.GetArticleController(c)
        })
        api.GET("/article/:id", func(c *gin.Context) {
            cntlr.GetSingleArticleController(c)
        })
        api.GET("/delete/:id", func(c *gin.Context) {
            cntlr.DeleteArticleController(c)
        })
        api.POST("/post", func(c *gin.Context) {
            cntlr.PostController(c)
        })
        api.POST("/post/image", func(c *gin.Context) {
            cntlr.PostImageController(c)
        })
        api.POST("/post/image/db", func(c *gin.Context) {
            cntlr.PostImageToDBController(c)
        })
    }

    router.Run(":2345")
}

db.go

package db

import "database/sql"

type Database struct {
    MYSQL_USER     string
    MYSQL_PASSWORD string
    MYSQL_HOST     string
    DATABASE       *sql.DB
}

func NewDatabase(user, password, host string) *Database {
    db, err := sql.Open("mysql", user+":"+password+"@tcp("+host+":3306)/article")
    if err != nil {
        panic(err.Error())
    }

    defer db.Close()

    err = db.Ping()
    if err != nil {
        panic(err.Error())
    }

    _, err = db.Exec("CREATE DATABASE IF NOT EXISTS article;")
    if err != nil {
        panic(err)
    }

    _, err = db.Exec("use article;")
    if err != nil {
        panic(err)
    }

    _, err = db.Exec("CREATE TABLE IF NOT EXISTS `articles` (`id` int NOT NULL AUTO_INCREMENT PRIMARY KEY,uuid varchar(36), `title` VARCHAR(100) NOT NULL,`content` TEXT NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;")
    if err != nil {
        panic(err)
    }

    _, err = db.Exec("create table IF NOT EXISTS images (id int AUTO_INCREMENT NOT NULL PRIMARY KEY, article_uuid varchar(36), image_name varchar(50)); ")
    if err != nil {
        panic(err)
    }
    Database := new(Database)
    Database.DATABASE = db
    return Database
}

Here is full source code(branch: refactor-db):
https://github.com/jpskgc/article/tree/refactor-db

I expect there is no error when running go run main.go.
But the actual is not.
There will be some problem around db.go.

Here is the error message.

GET /api/articles HTTP/1.1
Host: localhost:2345
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cache-Control: max-age=0
Connection: keep-alive
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: none
Sec-Fetch-User: ?1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36


sql: database is closed
/Users/jpskgc/article/api/dao/dao.go:36 (0x1553240)
        (*Dao).GetArticleDao: panic(err.Error())
/Users/jpskgc/article/api/service/service.go:34 (0x17a9abb)
        Service.GetArticleService: results := s.dao.GetArticleDao()
/Users/jpskgc/article/api/controller/controller.go:19 (0x17cd664)
        Controller.GetArticleController: articles := controller.service.GetArticleService()
/Users/jpskgc/article/api/main.go:79 (0x17cec1f)
        main.func2: cntlr.GetArticleController(c)
/Users/jpskgc/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:124 (0x1791e89)
        (*Context).Next: c.handlers[c.index](c)
/Users/jpskgc/go/pkg/mod/github.com/gin-gonic/[email protected]/recovery.go:83 (0x17a5159)
        RecoveryWithWriter.func1: c.Next()
/Users/jpskgc/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:124 (0x1791e89)
        (*Context).Next: c.handlers[c.index](c)
/Users/jpskgc/go/pkg/mod/github.com/gin-gonic/[email protected]/logger.go:240 (0x17a4200)
        LoggerWithConfig.func1: c.Next()
/Users/jpskgc/go/pkg/mod/github.com/gin-gonic/[email protected]/context.go:124 (0x1791e89)
        (*Context).Next: c.handlers[c.index](c)
/Users/jpskgc/go/pkg/mod/github.com/gin-gonic/[email protected]/gin.go:389 (0x179b6a1)
        (*Engine).handleHTTPRequest: c.Next()
/Users/jpskgc/go/pkg/mod/github.com/gin-gonic/[email protected]/gin.go:351 (0x179aed3)
        (*Engine).ServeHTTP: engine.handleHTTPRequest(c)
/usr/local/go/src/net/http/server.go:2774 (0x12e2a07)
        serverHandler.ServeHTTP: handler.ServeHTTP(rw, req)
/usr/local/go/src/net/http/server.go:1878 (0x12de5f0)
        (*conn).serve: serverHandler{c.server}.ServeHTTP(w, w.req)
/usr/local/go/src/runtime/asm_amd64.s:1337 (0x1059ea0)
        goexit: BYTE    $0x90   // NOP

[GIN] 2019/09/10 - 16:58:46 | 500 |    5.990926ms |             ::1 | GET      /api/articles
like image 851
jpskgc.v7 Avatar asked Sep 10 '19 09:09

jpskgc.v7


People also ask

How do I connect to a GO database in MySQL?

With that out of the way, you are ready to connect. Create a main.go file and insert the following code: package main import ( "fmt" "database/sql" _ "github.com/go-sql-driver/mysql" ) func main() { db, err := sql. Open("mysql", "root:<yourMySQLdatabasepassword>@tcp(127.0.

Which database is used by Go language?

Here we will use MySQL as our underlying database. But before writing any code make sure that the MySQL driver for the database/sql package is installed properly.


1 Answers

Just remove defer db.Close() in db.go You need to close connection out of NewDatabase method

like image 81
Maxim Avatar answered Dec 20 '22 17:12

Maxim