我想制作一个通用模型结构以嵌入将使用gorp(https://github.com/coopernurse/gorp)将对象持久保存在MySQL数据库中的结构中。我的理解是,这种组合是如何在Go中完成功能的,这些功能是通过使用强OO语言进行继承来完成的。

但是,我运气不好,因为我想在GorpModel结构上定义所有CRUD方法,以避免在每个模型中重复它们,但这会导致gorp(因为我现在正在使用它)假定由于GorpModel使用的反射,我要与之交互的表称为gorp。自然会导致错误,因为我的数据库中没有这样的表。

有什么办法可以找出/使用我所在的类型(嵌入GorpModel的父类(super class))来使下面的代码起作用,还是我完全把错误的树吠叫了?

package models

import (
    "fmt"
    "reflect"
    "github.com/coopernurse/gorp"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

type GorpModel struct {
    New            bool   `db:"-"`
}

var dbm *gorp.DbMap = nil

func (gm *GorpModel) DbInit() {
    gm.New = true
    if dbm == nil {
        db, err := sql.Open("mysql", "username:password@my_db")
        if err != nil {
            panic(err)
        }
        dbm = &gorp.DbMap{Db: db, Dialect: gorp.MySQLDialect{"InnoDB", "UTF8"}}
        dbm.AddTable(User{}).SetKeys(true, "Id")
        dbm.CreateTables()
    }
}

func (gm *GorpModel) Create() {
    err := dbm.Insert(gm)
    if err != nil {
        panic(err)
    }
}

func (gm *GorpModel) Delete() int64 {
    nrows, err := dbm.Delete(gm)
    if err != nil {
        panic(err)
    }

    return nrows
}

func (gm *GorpModel) Update() {
    _, err := dbm.Update(gm)
    if err != nil {
        panic(err)
    }
}
New结构的GorpModel属性用于跟踪它是一个新创建的模型,还是我们应该在Update(目前在子Insert结构中定义)上调用SaveUser

最佳答案



不。

我不知道构造解决方案的最佳方法,但是相对于CRUD,您正在尝试以某种基类实现,只需将它们编写为函数即可。 IE。

func Create(gm interface{}) { // or whatever the signature should be
    err := dbm.Insert(gm)
    if err != nil {
        panic(err)
    }
}

10-04 19:16