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