国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

gf框架之gdb - 優(yōu)雅強(qiáng)大的數(shù)據(jù)庫(kù)ORM

muzhuyu / 2107人閱讀

摘要:文章來(lái)源框架的數(shù)據(jù)庫(kù)操作由包提供支持,包經(jīng)過(guò)非常精心優(yōu)雅的設(shè)計(jì),提供了非常強(qiáng)大的配置管理方法操作鏈?zhǔn)讲僮魇聞?wù)操作等功能。其他鏈?zhǔn)讲僮髡?qǐng)參考上述鏈?zhǔn)讲僮髡鹿?jié)。

文章來(lái)源:http://gf.johng.cn/494380

gf框架的數(shù)據(jù)庫(kù)ORM操作由gdb包提供支持,gdb包經(jīng)過(guò)非常精心優(yōu)雅的設(shè)計(jì),提供了非常強(qiáng)大的配置管理、方法操作、鏈?zhǔn)讲僮?、事?wù)操作等功能。gdb包具體API說(shuō)明文檔詳見(jiàn):godoc 。本章節(jié)對(duì)gdb包的使用進(jìn)行基本的介紹,包括:gdb包基本功能介紹,配置管理功能說(shuō)明,常見(jiàn)用法及常用操作示例。

使用方式:

import "gitee.com/johng/gf/g/database/gdb"
數(shù)據(jù)庫(kù)配置

gdb數(shù)據(jù)結(jié)構(gòu):

type List        []Map                  // 數(shù)據(jù)記錄列表 
type Map         map[string]interface{} // 數(shù)據(jù)記錄
type Config      map[string]ConfigGroup // 數(shù)據(jù)庫(kù)配置對(duì)象
type ConfigGroup []ConfigNode           // 數(shù)據(jù)庫(kù)分組配置
// 數(shù)據(jù)庫(kù)配置項(xiàng)(一個(gè)分組配置對(duì)應(yīng)多個(gè)配置項(xiàng))
type ConfigNode  struct {
    Host     string // 地址
    Port     string // 端口
    User     string // 賬號(hào)
    Pass     string // 密碼
    Name     string // 數(shù)據(jù)庫(kù)名稱
    Type     string // 數(shù)據(jù)庫(kù)類型:mysql, sqlite, mssql, pgsql, oracle(目前僅支持mysql,pgsql)
    Role     string // (可選,默認(rèn)為master)數(shù)據(jù)庫(kù)的角色,用于主從操作分離,至少需要有一個(gè)master,參數(shù)值:master, slave
    Charset  string // (可選,默認(rèn)為 utf-8)編碼,默認(rèn)為 utf-8
    Priority int    // (可選)用于負(fù)載均衡的權(quán)重計(jì)算,當(dāng)集群中只有一個(gè)節(jié)點(diǎn)時(shí),權(quán)重沒(méi)有任何意義
    Linkinfo string // (可選)自定義鏈接信息,當(dāng)該字段被設(shè)置值時(shí),以上鏈接字段(Host,Port,User,Pass,Name)將失效(該字段是一個(gè)擴(kuò)展功能,參考sql.Open參數(shù))
}

其中,Map和List用于數(shù)據(jù)表記錄操作,分別對(duì)應(yīng)一條數(shù)據(jù)表記錄和數(shù)據(jù)表記錄列表;Config、ConfigGroup及ConfigNode用于數(shù)據(jù)庫(kù)配置管理,ConfigNode用于存儲(chǔ)一個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)信息,ConfigGroup用于管理多個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)組成的配置分組(一般一個(gè)分組對(duì)應(yīng)一個(gè)業(yè)務(wù)數(shù)據(jù)庫(kù)集群),Config用于管理多個(gè)ConfigGroup配置分組。

gdb主要特點(diǎn):

支持多節(jié)點(diǎn)數(shù)據(jù)庫(kù)集群管理,采用單例模式管理數(shù)據(jù)庫(kù)實(shí)例化對(duì)象;

支持對(duì)數(shù)據(jù)庫(kù)集群分組管理,按照分組名稱獲取實(shí)例化的數(shù)據(jù)庫(kù)操作對(duì)象;

支持多種關(guān)系型數(shù)據(jù)庫(kù)管理,可通過(guò)ConfigNode.Type屬性進(jìn)行配置(目前僅支持mysql和pgsql數(shù)據(jù)庫(kù));

支持Master-Slave讀寫分離,可通過(guò)ConfigNode.Role屬性進(jìn)行配置;

支持客戶端的負(fù)載均衡管理,可通過(guò)ConfigNode.Priority屬性進(jìn)行配置,值越大,優(yōu)先級(jí)越高;

特別說(shuō)明,gdb的配置管理最大的特點(diǎn)是,(同一進(jìn)程中)所有的數(shù)據(jù)庫(kù)集群信息都使用同一個(gè)配置管理模塊進(jìn)行統(tǒng)一維護(hù),不同業(yè)務(wù)的數(shù)據(jù)庫(kù)集群配置使用不同的分組名稱進(jìn)行配置和獲取。

配置方法

數(shù)據(jù)庫(kù)配置管理方法列表:

// 添加一個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)到指定的分組中
func AddConfigNode(group string, node ConfigNode)
// 添加一個(gè)配置分組到數(shù)據(jù)庫(kù)配置管理中(同名覆蓋)
func AddConfigGroup(group string, nodes ConfigGroup)

// 添加一個(gè)數(shù)據(jù)庫(kù)節(jié)點(diǎn)到默認(rèn)的分組中(默認(rèn)為default,可修改)
func AddDefaultConfigNode(node ConfigNode)
// 添加一個(gè)配置分組到數(shù)據(jù)庫(kù)配置管理中(默認(rèn)分組為default,可修改)
func AddDefaultConfigGroup(nodes ConfigGroup)

// 設(shè)置數(shù)據(jù)庫(kù)配置為定義的配置信息
func SetConfig(c Config)
// 設(shè)置默認(rèn)的分組名稱
func SetDefaultGroup(groupName string)

默認(rèn)分組表示,如果獲取數(shù)據(jù)庫(kù)對(duì)象時(shí)不指定配置分組名稱,那么gdb默認(rèn)讀取的配置分組。例如:gdb.Instance()可獲取一個(gè)默認(rèn)分組的數(shù)據(jù)庫(kù)單例對(duì)象。

簡(jiǎn)單的做法,我們可以通過(guò)gdb包的SetConfig配置管理方法進(jìn)行自定義的數(shù)據(jù)庫(kù)全局配置,例如:

gdb.SetConfig(gdb.Config {
    "default" : gdb.ConfigGroup {
        gdb.ConfigNode {
            Host     : "127.0.0.1",
            Port     : "3306",
            User     : "root",
            Pass     : "123456",
            Name     : "test",
            Type     : "mysql",
            Role     : "master",
            Priority : 100,
        },
        gdb.ConfigNode {
            Host     : "127.0.0.2",
            Port     : "3306",
            User     : "root",
            Pass     : "123456",
            Name     : "test",
            Type     : "mysql",
            Role     : "master",
            Priority : 100,
        },
    },
})
配置文件

當(dāng)然,gdb支持配置文件進(jìn)行配置,這樣也便于項(xiàng)目的配置管理,具體請(qǐng)參見(jiàn)【ORM高級(jí)用法】章節(jié)。

數(shù)據(jù)庫(kù)操作

gdb數(shù)據(jù)庫(kù)操作的方法比較多,具體詳見(jiàn)godoc,以下僅對(duì)一些常用的方法進(jìn)行介紹。

方法操作
// SQL操作方法,返回原生的標(biāo)準(zhǔn)庫(kù)sql對(duì)象
Query(query string, args ...interface{}) (*sql.Rows, error)
Exec(query string, args ...interface{}) (sql.Result, error)
Prepare(query string) (*sql.Stmt, error)

// 數(shù)據(jù)表記錄查詢:
// 查詢單條記錄、查詢多條記錄、查詢單個(gè)字段值(鏈?zhǔn)讲僮魍?
GetAll(query string, args ...interface{}) (List, error)
GetOne(query string, args ...interface{}) (Map, error)
GetValue(query string, args ...interface{}) (interface{}, error)

// 開啟事務(wù)操作
Begin() (*Tx, error)

// 數(shù)據(jù)單條操作
Insert(table string, data Map) (sql.Result, error)
Replace(table string, data Map) (sql.Result, error)
Save(table string, data Map) (sql.Result, error)

// 數(shù)據(jù)批量操作
BatchInsert(table string, list List, batch int) (sql.Result, error)
BatchReplace(table string, list List, batch int) (sql.Result, error)
BatchSave(table string, list List, batch int) (sql.Result, error)

// 數(shù)據(jù)修改/刪除
Update(table string, data interface{}, condition interface{}, args ...interface{}) (sql.Result, error)
Delete(table string, condition interface{}, args ...interface{}) (sql.Result, error)

// 創(chuàng)建鏈?zhǔn)讲僮鲗?duì)象(Table為From的別名)
Table(tables string) (*DbOp)
From(tables string) (*DbOp)
    
// 關(guān)閉數(shù)據(jù)庫(kù)
Close() error

需要說(shuō)明一下Insert/Replace/Save三者的區(qū)別(BatchInsert/BatchReplace/BatchSave同理):

Insert:使用insert into語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)寫入,如果寫入的數(shù)據(jù)中存在Primary Key或者Unique Key的情況,返回失敗,否則寫入一條新數(shù)據(jù);

Replace:使用replace into語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)寫入,如果寫入的數(shù)據(jù)中存在Primary Key或者Unique Key的情況,刪除原有記錄,按照給定數(shù)據(jù)新寫入一條新記錄,否則寫入一條新數(shù)據(jù);

Save:使用insert into語(yǔ)句進(jìn)行數(shù)據(jù)庫(kù)寫入,如果寫入的數(shù)據(jù)中存在Primary Key或者Unique Key的情況,更新原有數(shù)據(jù),否則寫入一條新數(shù)據(jù);

鏈?zhǔn)讲僮?/b>

gdb提供簡(jiǎn)便靈活的鏈?zhǔn)讲僮鹘涌?,通過(guò)數(shù)據(jù)庫(kù)對(duì)象的db.Table/db.From方法或者事務(wù)對(duì)象的tx.Table/tx.From方法基于指定的數(shù)據(jù)表返回一個(gè)鏈?zhǔn)讲僮鲗?duì)象DbOp,該對(duì)象可以執(zhí)行以下方法(具體方法說(shuō)明請(qǐng)參考API文檔)。

func LeftJoin(joinTable string, on string) (*DbOp)
func RightJoin(joinTable string, on string) (*DbOp)
func InnerJoin(joinTable string, on string) (*DbOp)

func Fields(fields string) (*DbOp)
func Limit(start int, limit int) (*DbOp)
func Data(data interface{}) (*DbOp)
func Batch(batch int) *DbOp

func Where(where string, args...interface{}) (*DbOp)
func GroupBy(groupby string) (*DbOp)
func OrderBy(orderby string) (*DbOp)

func Insert() (sql.Result, error)
func Replace() (sql.Result, error)
func Save() (sql.Result, error)
func Update() (sql.Result, error)
func Delete() (sql.Result, error)


func Select() (List, error)
func All() (List, error)
func One() (Map, error)
func Value() (interface{}, error)
數(shù)據(jù)庫(kù)示例

https://gitee.com/johng/gf/bl...

方法操作

獲取ORM單例對(duì)象

// 獲取默認(rèn)配置的數(shù)據(jù)庫(kù)對(duì)象(配置名稱為"default")
db, err := gdb.Instance()
// 獲取配置分組名稱為"user-center"的數(shù)據(jù)庫(kù)對(duì)象
db, err := gdb.Instance("user-center")

數(shù)據(jù)寫入

r, err := db.Insert("user", gdb.Map {
    "name": "john",
})

數(shù)據(jù)查詢(列表)

list, err := db.GetAll("select * from user limit 2")

數(shù)據(jù)查詢(單條)

one, err := db.GetOne("select * from user limit 2")
// 或者
one, err := db.GetOne("select * from user where uid=1000")

數(shù)據(jù)保存

r, err := db.Save("user", gdb.Map {
    "uid"  :  1,
    "name" : "john",
})

批量操作

// BatchInsert/BatchReplace/BatchSave 同理
_, err := db.BatchInsert("user", gdb.List {
    {"name": "john_1"},
    {"name": "john_2"},
    {"name": "john_3"},
    {"name": "john_4"},
}, 10)

數(shù)據(jù)更新/刪除

// db.Update/db.Delete 同理
r, err := db.Update("user", gdb.Map {"name": "john"}, "uid=?", 10000)
r, err := db.Update("user", "name="john"", "uid=10000")
r, err := db.Update("user", "name=?", "uid=?", "john", 10000)

注意,參數(shù)域支持并建議使用預(yù)處理模式進(jìn)行輸入,避免SQL注入風(fēng)險(xiǎn)。

鏈?zhǔn)讲僮?/b>

鏈?zhǔn)讲樵?/strong>

// 查詢多條記錄并使用Limit分頁(yè)
r, err := db.Table("user u").LeftJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*, ud.site").Where("u.uid > ?", 1).Limit(0, 10).Select()
// 查詢符合條件的單條記錄(第一條)
r, err := db.Table("user u").LeftJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*,ud.site").Where("u.uid=?", 1).One()
// 查詢字段值
r, err := db.Table("user u").LeftJoin("user_detail ud", "u.uid=ud.uid").Fields("ud.site").Where("u.uid=?", 1).Value()
// 分組及排序
r, err := db.Table("user u").LeftJoin("user_detail ud", "u.uid=ud.uid").Fields("u.*,ud.city").GroupBy("city").OrderBy("register_time asc").Select()

鏈?zhǔn)礁?刪除

// 更新
r, err := db.Table("user").Data(gdb.Map{"name" : "john2"}).Where("name=?", "john").Update()
r, err := db.Table("user").Data("name="john3"").Where("name=?", "john2").Update()
// 刪除
r, err := db.Table("user").Where("uid=?", 10).Delete()

鏈?zhǔn)綄懭?保存

r, err := db.Table("user").Data(gdb.Map{"name": "john"}).Insert()
r, err := db.Table("user").Data(gdb.Map{"uid": 10000, "name": "john"}).Replace()
r, err := db.Table("user").Data(gdb.Map{"uid": 10001, "name": "john"}).Save()

鏈?zhǔn)脚繉懭?/strong>

r, err := db.Table("user").Data(gdb.List{
    {"name": "john_1"},
    {"name": "john_2"},
    {"name": "john_3"},
    {"name": "john_4"},
}).Insert()

可以指定批量操作中分批寫入數(shù)據(jù)庫(kù)的每批次寫入條數(shù)數(shù)量:

r, err := db.Table("user").Data(gdb.List{
    {"name": "john_1"},
    {"name": "john_2"},
    {"name": "john_3"},
    {"name": "john_4"},
}).Batch(2).Insert()

鏈?zhǔn)脚勘4?/strong>

r, err := db.Table("user").Data(gdb.List{
    {"uid":10000, "name": "john_1"},
    {"uid":10001, "name": "john_2"},
    {"uid":10002, "name": "john_3"},
    {"uid":10003, "name": "john_4"},
}).Save()

事務(wù)操作

開啟事務(wù)操作可以通過(guò)執(zhí)行db.Begin方法,該方法返回事務(wù)的操作對(duì)象,類型為*gdb.Tx,通過(guò)該對(duì)象執(zhí)行后續(xù)的數(shù)據(jù)庫(kù)操作,并可通過(guò)tx.Commit提交修改,或者通過(guò)tx.Rollback回滾修改。

開啟事務(wù)操作

if tx, err := db.Begin(); err == nil {
    fmt.Println("開啟事務(wù)操作")
}

事務(wù)操作對(duì)象可以執(zhí)行所有db對(duì)象的方法,具體請(qǐng)參考API文檔。

事務(wù)回滾操作

if tx, err := db.Begin(); err == nil {
    r, err := tx.Save("user", gdb.Map{
        "uid"  :  1,
        "name" : "john",
    })
    tx.Rollback()
    fmt.Println(r, err)
}

事務(wù)提交操作

if tx, err := db.Begin(); err == nil {
    r, err := tx.Save("user", gdb.Map{
        "uid"  :  1,
        "name" : "john",
    })
    tx.Commit()
    fmt.Println(r, err)
}

事務(wù)鏈?zhǔn)讲僮?/strong>
事務(wù)操作對(duì)象仍然可以通過(guò)tx.Table或者tx.From方法返回一個(gè)鏈?zhǔn)讲僮鞯膶?duì)象,該對(duì)象與db.Table或者db.From方法返回值相同,只不過(guò)數(shù)據(jù)庫(kù)操作在事務(wù)上執(zhí)行,可提交或回滾。

if tx, err := db.Begin(); err == nil {
    r, err := tx.Table("user").Data(gdb.Map{"uid":1, "name": "john_1"}).Save()
    tx.Commit()
    fmt.Println(r, err)
}

其他鏈?zhǔn)讲僮髡?qǐng)參考上述鏈?zhǔn)讲僮髡鹿?jié)。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/38979.html

相關(guān)文章

  • 輕量級(jí) PHP 框架 TinyLara 更新:更優(yōu)雅 附中文介紹

    摘要:中文介紹是一個(gè)輕量級(jí)框架,基于,可以看成的精簡(jiǎn)版。官方網(wǎng)站項(xiàng)目地址開始使用下載或者安裝依賴包修改數(shù)據(jù)庫(kù)配置文件,將導(dǎo)入數(shù)據(jù)庫(kù)。一行代碼即可發(fā)送郵件。協(xié)議采用協(xié)議分發(fā),衍生項(xiàng)目除了必須采用協(xié)議之外無(wú)任何限制。 TinyLara showImg(http://lvwenhan.com/content/uploadfile/201410/dcd81414652600.png); __...

    loonggg 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<