gpt4 book ai didi

其他包上的 GORM 数据库连接

转载 作者:IT王子 更新时间:2023-10-29 02:09:39 24 4
gpt4 key购买 nike

我开始学习 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()
}

人.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)
}
}

主.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项目中学习到的一些知识

最佳答案

刚开始学习 GO 时,通常我们会把所有的东西都放在一个 main.go 文件中,然后我们会考虑将代码拆分到多个文件中。

这就是依赖注入(inject)发挥作用的时候了。

我们可以创建类似这样的 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
}

ma​​in.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
}

您可以在 Alex Edwards post 中阅读完整的代码和解释

关于其他包上的 GORM 数据库连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51046557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com