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 createJobsTable
method.
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)
}