Go and Gin:为数据库上下文传递struct吗?

谷物吹笛者

我刚刚开始尝试Go,并且希望重新实现用node编写的API服务器。

尝试使用依赖项注入来传递数据库上下文作为杜松子酒中间件时遇到了障碍。到目前为止,我已经将其设置为:

main.go:

package main

import (
        "fmt"
        "runtime"
        "log"
        "github.com/gin-gonic/gin"
        "votesforschools.com/api/public"
        "votesforschools.com/api/models"
)

type DB struct {
        models.DataStore
}

func main() {
        ConfigRuntime()
        ConfigServer()
}

func Database(connectionString string) gin.HandlerFunc {
        dbInstance, err := models.NewDB(connectionString)
        if err != nil {
                log.Panic(err)
        }

        db := &DB{dbInstance}

        return func(c *gin.Context) {
                c.Set("DB", db)
                c.Next()
        }
}


func ConfigRuntime() {
        nuCPU := runtime.NumCPU()
        runtime.GOMAXPROCS(nuCPU)
        fmt.Printf("Running with %d CPUs\n", nuCPU)
}

func ConfigServer() {

        gin.SetMode(gin.ReleaseMode)

        router := gin.New()
        router.Use(Database("<connectionstring>"))
        router.GET("/public/current-vote-pack", public.GetCurrentVotePack)
        router.Run(":1000")
}

型号/db.go

package models

import (
        "database/sql"
        _ "github.com/go-sql-driver/mysql"
)

type DataStore interface {
        GetVotePack(id string) (*VotePack, error)
}

type DB struct {
        *sql.DB
}

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

型号/voicepack.go

package models

import (
        "time"
        "database/sql"
)

type VotePack struct {
        id string
        question string
        description string
        startDate time.Time
        endDate time.Time
        thankYou string
        curriculum []string
}

func (db *DB) GetVotePack(id string) (*VotePack, error) {

        var votePack *VotePack

        err := db.QueryRow(
                "SELECT id, question, description, start_date AS startDate, end_date AS endDate, thank_you AS thankYou, curriculum WHERE id = ?", id).Scan(
                &votePack.id, &votePack.question, &votePack.description, &votePack.startDate, &votePack.endDate, &votePack.thankYou, &votePack.curriculum)

        switch {
        case err == sql.ErrNoRows:
                return nil, err
        case err != nil:
                return nil, err
         default:
                return votePack, nil
        }
}

因此,对于上述所有内容,我都希望将models.DataSource作为中间件传递,以便可以像这样进行访问:

public / public.go

package public

import (
        "github.com/gin-gonic/gin"
)

func GetCurrentVotePack(context *gin.Context) {
        db := context.Keys["DB"]

        votePack, err := db.GetVotePack("c5039ecd-e774-4c19-a2b9-600c2134784d")
        if err != nil{
                context.String(404, "Votepack Not Found")
        }
        context.JSON(200, votePack)
}

但是我明白了 public\public.go:10: db.GetVotePack undefined (type interface {} is interface with no methods)

当我在调试器中检查(使用Webstorm和插件)时,db只是一个空对象。我正在努力做一个好人,避免使用全局变量

Sno问题

其中的值context.Keys都是type interface{},因此在db*DB其转换回该类型之前将无法从type调用方法

安全的方法:

db, ok := context.Keys["DB"].(*DB)
if !ok {
        //Handle case of no *DB instance
}
// db is now a *DB value

不太安全的方法,如果context.Keys["DB"]不是type的值,则会恐慌*DB

db := context.Keys["DB"].(*DB)
// db is now a *DB value

有效的Go对此进行了介绍。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在MongoDB中选择从数据上下文传递的字段

来自分类Dev

向上下文传递IntentService

来自分类Dev

MVVM-如何将上下文传递到存储库类?

来自分类Dev

将上下文传递给android活动中的helper类会泄漏吗?

来自分类Dev

如何修改作为子模板中的数据上下文传递的数组的项目?

来自分类Dev

将正确的上下文传递给Angular中的对话框数据

来自分类Dev

如何将数据上下文传递给Asp .Net Core中的静态方法

来自分类Dev

我们可以像在python中一样在Go中创建上下文管理器吗

来自分类Dev

将包含属性的上下文传递给TypeConverter

来自分类Dev

将上下文传递给接口方法

来自分类Dev

将ZMQ上下文传递给线程

来自分类Dev

骨干“ this”上下文传递给渲染

来自分类Dev

将验证上下文传递给关联模型

来自分类Dev

有使用数据库上下文类的正确方法吗?

来自分类Dev

在我的域模型中有数据库上下文可以吗

来自分类Dev

支持Go的NoSQL数据库列表

来自分类Dev

ContentResolver AndroidX IllegalArgumentException无法为数据库提供空上下文

来自分类Dev

上下文为空,所以我无法打开数据库

来自分类Dev

使用 Autofac IOC 时实体框架数据库上下文为空

来自分类Dev

Light在MVC中注入数据库上下文

来自分类Dev

静态数据库上下文混乱

来自分类Dev

Glass上下文数据库null

来自分类Dev

Linq Sql数据库上下文丢失方法

来自分类Dev

使用不同的上下文访问数据库

来自分类Dev

数据库上下文中缺少GetTable <TEntity>()

来自分类Dev

Glass上下文数据库null

来自分类Dev

为什么我的数据库上下文被处置

来自分类Dev

SignalR 和数据库上下文处理

来自分类Dev

使用setRetainInstance(true)将上下文传递给Fragment内的ArrayAdapter会导致泄漏吗?

Related 相关文章

  1. 1

    在MongoDB中选择从数据上下文传递的字段

  2. 2

    向上下文传递IntentService

  3. 3

    MVVM-如何将上下文传递到存储库类?

  4. 4

    将上下文传递给android活动中的helper类会泄漏吗?

  5. 5

    如何修改作为子模板中的数据上下文传递的数组的项目?

  6. 6

    将正确的上下文传递给Angular中的对话框数据

  7. 7

    如何将数据上下文传递给Asp .Net Core中的静态方法

  8. 8

    我们可以像在python中一样在Go中创建上下文管理器吗

  9. 9

    将包含属性的上下文传递给TypeConverter

  10. 10

    将上下文传递给接口方法

  11. 11

    将ZMQ上下文传递给线程

  12. 12

    骨干“ this”上下文传递给渲染

  13. 13

    将验证上下文传递给关联模型

  14. 14

    有使用数据库上下文类的正确方法吗?

  15. 15

    在我的域模型中有数据库上下文可以吗

  16. 16

    支持Go的NoSQL数据库列表

  17. 17

    ContentResolver AndroidX IllegalArgumentException无法为数据库提供空上下文

  18. 18

    上下文为空,所以我无法打开数据库

  19. 19

    使用 Autofac IOC 时实体框架数据库上下文为空

  20. 20

    Light在MVC中注入数据库上下文

  21. 21

    静态数据库上下文混乱

  22. 22

    Glass上下文数据库null

  23. 23

    Linq Sql数据库上下文丢失方法

  24. 24

    使用不同的上下文访问数据库

  25. 25

    数据库上下文中缺少GetTable <TEntity>()

  26. 26

    Glass上下文数据库null

  27. 27

    为什么我的数据库上下文被处置

  28. 28

    SignalR 和数据库上下文处理

  29. 29

    使用setRetainInstance(true)将上下文传递给Fragment内的ArrayAdapter会导致泄漏吗?

热门标签

归档