其他包装上的GORM DB连接

时间:2018-06-26 15:30:10

标签: go

我开始学习Go,阅读有关指针的知识,并希望拆分数据库连接和API的处理函数。通过遵循此solution,已经尝试过自己,但是当我尝试读取数据时,出现此错误

[2018-06-26 21:59:45] sql:数据库已关闭 这是我的源代码。

db.go

package db

import (
"fmt"

"github.com/jinzhu/gorm"
"github.com/joho/godotenv"

"os"
)

var Db *gorm.DB

func Open() error {

  var err error
  _ = godotenv.Load(".env")

  dbType := os.Getenv("DB_TYPE")
  dbConnString := os.Getenv("DB_CONN_STRING")

  Db, err = gorm.Open(dbType, dbConnString)
  if err != nil {
    fmt.Println(err)
  }
  Db.LogMode(true)
  defer Db.Close()

  return err
}

func Close() error {
    return Db.Close()
}

person.go

package model

import (
    "github.com/jinzhu/gorm"
    "github.com/gin-gonic/gin"
    "fmt"
    "namastra/gin/result"
    "namastra/gin/db"
)

type Person struct {
    gorm.Model
    FirstName string `json:”firstname”`
    LastName  string `json:”lastname”`
}

/*var db *gorm.DB
var err error*/

func GetPeople(c *gin.Context) {

    var people []result.Person
    if err := db.Db.Select("ID,first_name,last_name").Find(&people).Error; err != nil {
        c.AbortWithStatus(404)
        fmt.Println(err)
    } else {
        c.JSON(200, people)
    }
}

main.go

package main

import (
    "log"
    "namastra/gin/handler"
    "namastra/gin/model"
    "net/http"
    "time"

    "github.com/adam-hanna/jwt-auth/jwt"
    "github.com/gin-gonic/gin"
    _ "github.com/jinzhu/gorm/dialects/postgres"

    "namastra/gin/db"
)

func main() {
if err := db.Open(); err != nil {
    // handle error
    panic(err)
}
defer db.Close()

router := gin.Default()
router.Use(gin.Recovery())
private := router.Group("/auth")

....(ommited)

router.GET("/", gin.WrapH(regularHandler))
router.GET("/people/", model.GetPeople)
router.Run("127.0.0.1:3000")
}

对不起,我的英语不好,谢谢您的帮助。

谢谢。

edit1:案件关闭

解决方案是通过删除

defer Db.Close()

来自db.go。

edi2:通过在go项目中工作来更新我学到的一些知识

1 个答案:

答案 0 :(得分:1)

开始学习GO时,通常我们将所有内容都放在一个main.go文件中,并且我们认为将代码拆分为多个文件。

这是依赖注入来的时间开始播放的时间。

我们可以创建类似这样的 Env 来存储处理程序。

type Env struct {
    db *sql.DB
    logger *log.Logger
    templates *template.Template
}

并在 models / db.go

中创建类似的内容
package models

import (
    "database/sql"
    _ "github.com/lib/pq"
)

func NewDB(dataSourceName string) (*sql.DB, error) {
    db, err := sql.Open("postgres", dataSourceName)
    if err != nil {
        return nil, err
    }
    if err = db.Ping(); err != nil {
        return nil, err
    }
    return db, nil
}

main.go 文件

package main

import (
    "namastra/gin/models"
    "database/sql"
    "fmt"
    "log"
    "net/http"
)

type Env struct {
    db *sql.DB
}

func main() {
    db, err := models.NewDB("postgres://user:pass@localhost/bookstore")
    if err != nil {
        log.Panic(err)
    }
    env := &Env{db: db}

    http.HandleFunc("/peoples", env.peoplesIndex)
    http.ListenAndServe(":3000", nil)
}

func (env *Env) peoplesIndex(w http.ResponseWriter, r *http.Request) {
   # ...
}

models / people.go

package models

import "database/sql"

type Book struct {
    Isbn   string
    Title  string
    Author string
    Price  float32
}

func AllPeoples(db *sql.DB) ([]*People, error) {
    rows, err := db.Query("SELECT * FROM peoples")
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    # ... ommited for simplicity
}

您可以在Documentation

中阅读完整的代码和说明。