2

MySQL データベースでオブジェクトを永続化するためにgorp( https://github.com/coopernurse/gorp ) を使用する構造体に埋め込む汎用モデル構造体を作成したいと考えています。この種の構成は、強力な OO 言語で継承によって行われることを Go で達成する方法であると私は理解しています。

GorpModelただし、各モデルでそれらを繰り返さないように、構造体ですべての CRUD メソッドを定義したいので、うまくいきませんでしたが、これによりgorp(現在使用しているため)、対話したいテーブルはGorpModel、使用するリフレクションのために呼び出されgorpます。データベースにそのようなテーブルがないため、当然エラーが発生します。

GorpModel以下のコードを機能させるために、私がどのタイプ(埋め込まれているスーパークラス)にいるかを把握/使用する方法はありますか、それとも間違ったツリーを完全に吠えていますか?

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を追跡するために使用されます。UpdateInsertSaveUser

4

1 に答える 1

2

私がどのタイプにいるのかを把握/使用する方法はありますか (GorpModel が埋め込まれているスーパークラス)

いいえ。

ソリューションを構築する最良の方法はわかりませんが、ある種の基本クラスに実装しようとしている CRUD に関しては、それらを関数として記述してください。すなわち。

func Create(gm interface{}) { // or whatever the signature should be
    err := dbm.Insert(gm)
    if err != nil {
        panic(err)
    }
}
于 2013-04-21T17:28:21.867 に答える