Database is closed in MVC refactoring

I had the back-end working, but I’m in the process of adding routing and refactoring code into MVC.
The error database is closed appears after adding the createJobsTablemethod.
I’d like to know why this is happening and how to solve this issue.

Please consider the following go file extracts:
// File main.go

package main

import (
	"fmt"
	"net/http"

	"github.com/lpvm/newest_sapo_jobs/controllers"
)

func main() {
	uc := controllers.NewUserController()
	fmt.Println("usercontroller: ", uc)
	jc := controllers.NewJobController()

	http.Handle("/favicon.ico", http.NotFoundHandler())
	http.HandleFunc("/", jc.ServeIndex)

	http.ListenAndServe(":8079", nil)

}

// File controllers.go

package controllers

import (
	"html/template"
	"net/http"
	"sync"

	"github.com/lpvm/newest_sapo_jobs/models"
)
type UserController struct{}
type JobController struct{}

func NewUserController() *UserController {
	return &UserController{}
}

var tpl *template.Template

func NewJobController() *JobController {
	return &JobController{}
}

func (j JobController) ServeIndex(w http.ResponseWriter, req *http.Request) {

	tpl.ExecuteTemplate(w, "index.gohtml", nil)
}

var db = models.OpenDb()
var dbModels = models.NewDbModel()

func init() {
	tpl = template.Must(template.ParseGlob("templates/*.gohtml"))
	dbModels.InitTables(db)
}

// File models.go

package models

import (
	"database/sql"
	"log"
	_ "github.com/mattn/go-sqlite3"
)

const dbName = "jobs.db"

func checkError(e error) {
	if e != nil {
		log.Fatal(e)
	}
}

type DbModel struct{}

func NewDbModel() *DbModel {
	return &DbModel{}
}

func OpenDb() *sql.DB {
	db, err := sql.Open("sqlite3", dbName)
	checkError(err)
	defer db.Close()
	return db
}

func (dbm DbModel) InitTables(db *sql.DB) {
	dbm.createJobsTable(db)
}

func (dbm DbModel) createJobsTable(db *sql.DB) {
	stmt, err := db.Prepare(`CREATE TABLE IF NOT EXISTS jobs (
		id INTEGER PRIMARY KEY NOT NULL,
		date TEXT NOT NULL);`)
	checkError(err)
	_, err = stmt.Exec()
	checkError(err)
}

update your code in DB,if defer.close return db is closed state.
*sql.DB is database pool, not close it!

func OpenDb() *sql.DB {
	db, err := sql.Open("sqlite3", dbName)
	checkError(err)
//	defer db.Close()
	return db
}

This topic was automatically closed 90 days after the last reply. New replies are no longer allowed.