日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

golang mysql封装_自己封装的golang 操作数据库方法

發布時間:2024/9/27 数据库 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 golang mysql封装_自己封装的golang 操作数据库方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這個是我用Go寫的第一個東東,可能還存在些BUG沒有測試到。這里主要是提供一個參考。各位可以改寫成自己的風格。

在命令行下輸入如下兩條命令,進行安裝

go get github.com/male110/SimpleDb

go install github.com/male110/SimpleDb

Go語言的數據庫操作,只能用Rows.Scan來一次性讀取所有列。感覺很不習慣,我還是習慣按照列名來一列列的取數據。所以我自己封裝了一個數據結構MyRows,MyRows實現了一個函數,GetValue(name string, value interface{})可以按列名來取數據。如下所示:

err = rows.GetValue("IsBoy", &isBoy)

if err != nil {

fmt.Println(err)

return

}

為了操作方便,還定義了其它的結構體,如MyDb,其Query函數可以直接返回?MyRows。NewDb用來創建MyDb結構,其參數與sql.Open一至,怎么傳取決于你所使用的驅動程序。

db, err := SimpleDb.NewDb("mysql", "root:123@tcp(127.0.0.1:3306)/test?charset=utf8")

if err != nil {

fmt.Println("打開SQL時出錯:", err.Error())

return

}

var rows *SimpleDb.MyRows

//從數據庫中取數據

rows, err = db.Query("select * from person")

if err != nil {

fmt.Println(err)

return

}

//顯示數據

for rows.Next() {

var id, age int

var name string

var isBoy bool

//按字段名取數據,也可以用rows.Scan(&id,&name,&age),來取

rows.GetValue("id", &id)

rows.GetValue("name", &name)

rows.GetValue("age", &age)

//可以根據返回值,判斷是否成功

err = rows.GetValue("IsBoy", &isBoy)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(id, "\t", name, "\t", age, "\t", isBoy)

}

同時還時現了一個簡單的ORM,實現了最基本的插入數據,修改數據,刪除數據。 我一般使用ORM只用這么幾個方法,其它的都是寫SQL語句。這里只是一個參考,大家可以根據自己的需要,自己習慣,進行修改。改成自己需要的格式。數據結構的定義格式如下:

type Person struct {

/*TableName類型只是用來設置表名。如果結構體名跟表名相同可以省略*/

TableName SimpleDb.TableName "person"

/*name是表名,PK用來設置是否主鍵,true主鍵,false非主鍵*/

Id int `name:"id"PK:"true"Auto:"true"`

Name string "name" //tag里的name表是對應的字段名

Age int "age" //tag里的age表是對應的字段名

IsBoy bool

NotUse string "-" //-不會保存到數據庫中

}

上面的說明已經很詳細了, SimpleDb.TableName類型的字段,只用來在tag中定義結構體對應的表名,如果沒有該字段,認為表名就是結構體名相同。 PK:"true"表示是主鍵,Auto:"true"表示該字段是自動增長的列,name:"id",來指定該字段對應的數據表中的列名,如不指定認為 跟字段名相同。當只需要指定列名時,可以直接寫在tag中,如:"name"、"age"。tag為"-"表示不對應數據表中的任何列。

// 插入數據

p := &Person{Name: "張三豐", Age: 500, IsBoy: true}

db.Insert(p)

//修改數據

db.Update(p)

//刪除數據

db.Delete(p)

下面來看一個完整的例子,首先他創表:

CREATE TABLE `person` (

`id` INT(50) NOT NULL AUTO_INCREMENT,

`name` VARCHAR(50) NULL DEFAULT NULL,

`age` INT(50) NULL DEFAULT NULL,

`IsBoy` SMALLINT(10) NULL,

PRIMARY KEY (`id`)

)

COLLATE='utf8_general_ci';

insert into `person` (name,age,IsBoy) values('張三',20,0);

insert into `person` (name,age,IsBoy) values('王五',19,1);

下面是完整的代碼

package main

import (

"fmt"

_ "github.com/go-sql-driver/mysql"

"github.com/male110/SimpleDb"

)

type Person struct {

/*TableName類型只是用來設置表名。如果結構體名跟表名相同可以省略*/

TableName SimpleDb.TableName "person"

/*name是表名,PK用來設置是否主鍵,true主鍵,false非主鍵*/

Id int `name:"id"PK:"true"Auto:"true"`

Name string "name" //tag里的name表是對應的字段名

Age int "age" //tag里的age表是對應的字段名

IsBoy bool

NotUse string "-" //-不會保存到數據庫中

}

func main() {

db, err := SimpleDb.NewDb("mysql", "root:123@tcp(127.0.0.1:3306)/test?charset=utf8")

if err != nil {

fmt.Println("打開SQL時出錯:", err.Error())

return

}

defer db.Close()

p := &Person{Name: "張三豐", Age: 500, IsBoy: true}

//插入一條數據

err = db.Insert(p)

if err != nil {

fmt.Println(err)

return

}

fmt.Println("新插入數據的ID:", p.Id)

var rows *SimpleDb.MyRows

//從數據庫中取數據

rows, err = db.Query("select * from person")

if err != nil {

fmt.Println(err)

return

}

//顯示數據

for rows.Next() {

var id, age int

var name string

var isBoy bool

//按字段名取數據,也可以用rows.Scan(&id,&name,&age),來取

rows.GetValue("id", &id)

rows.GetValue("name", &name)

rows.GetValue("age", &age)

//可以根據返回值,判斷是否成功

err = rows.GetValue("IsBoy", &isBoy)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(id, "\t", name, "\t", age, "\t", isBoy)

}

//輸出分割線

fmt.Println("==========割割割割割割割割============")

p.Name = "彭祖"

p.Age = 800

//修改數據

_, err = db.Update(p)

if err != nil {

fmt.Println(err, "xxxx")

return

}

//QueryDataRows返回一個DataRow數組,DataRow中有一map來存放行中的數據

var arrRow []SimpleDb.DataRow

arrRow, err = db.QueryDataRows("select * from person")

if err != nil {

fmt.Println(err, "zzzzz")

return

}

for _, row := range arrRow {

var id, age int

var name string

var isBoy bool

//只能按字段名取數據

row.GetValue("id", &id)

row.GetValue("name", &name)

row.GetValue("age", &age)

//可以根據返回值,判斷是否成功

err = rows.GetValue("IsBoy", &isBoy)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(id, "\t", name, "\t", age, isBoy)

}

var p2 Person

p2.Id = p.Id

//根據主鍵從數據庫中取單條數據

err = db.Load(&p2)

if err != nil {

fmt.Println(err)

return

}

fmt.Println(p2)

//根據主鍵刪除一條數據

db.Delete(p2)

}

有疑問加站長微信聯系(非本文作者)

總結

以上是生活随笔為你收集整理的golang mysql封装_自己封装的golang 操作数据库方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。