db - liangmanlin/gootp GitHub Wiki

游戏通常是需要数据库存储数据的,加入你刚好需要,但是呢,你又不想自己实现一些细节,你可以使用该db库。

import (
    "github.com/liangmanlin/gootp/db"
    )

    tabSlice := []*db.TabDef{
        {Name: "account", DataStruct: &Account{}, Pkey: []string{"Account"}, Keys: []string{"AgentID"}},
    }
    dbConfig = db.Config{Host: "127.0.0.1", Port: 3306, User: "root", PWD: "123456"}

    db.Start(dbConfig ,tabSlice, "dbName", "logDbName")

使用上面的代码启动db服务后,你就可以使用db库提供的函数了。

由于是使用反射获取的字段名,所以数据表的字段也是大写开头的。

你可能比较关注如下两个模块的api:

db_mod.go

  • ModSelectRow(db *sql.DB, tab string, key ...interface{}) interface{} 直接从数据库select单条数据,你可能需要db参数,可以通过 db.GameDB 全局变量获取。

  • ModSelectAll(db *sql.DB, tab string, key ...interface{}) []interface{} select多条数据。

  • ModUpdate(db *sql.DB, tab string, data interface{}) (sql.Result, error) 更新单条数据。

  • ModInsert(db *sql.DB, tab string, data interface{}) (sql.Result, error) 插入一条数据。

  • ModDelete(db *sql.DB, tab string, data interface{}) (sql.Result, error) 根据完整的数据,删除一条数据。

  • ModDeletePKey(db *sql.DB, tab string, pkey ...interface{}) (sql.Result, error) 根据主键,删除数据。

db_sync.go

与db_mod.go不同,这个模块是通过indexKey 取模,得到一个goroutine处理进程,这样可以规避多进程并发的问题。

  • SyncSelectRow(context *kernel.Context, tab string, indexKey int64, key ...interface{}) interface{} 查询单条记录。

-SyncSelect(context *kernel.Context, tab string, indexKey int64, key ...interface{}) []interface{} 查询多条记录。

  • SyncUpdate(tab string, indexKey int64, data interface{})

  • SyncInsert(tab string, indexKey int64, data interface{})

  • SyncDelete(tab string, indexKey int64, data interface{})

  • SyncDeletePKey(tab string, indexKey int64, pkey ...interface{})