看過了謝孟軍的Go語言Web變成的書籍之後,發現書中只講了沒有已駝峯命名的用法,所以在使用的時候踩了坑,解決辦法就是在struct字段名後面顯示的生命對應的數據庫表字段名。詳細測試過程如下。
package main
import (
"database/sql"
"fmt"
"github.com/astaxie/beedb"
_ "github.com/Go-SQL-Driver/MYSQL"
"log"
"time"
"video/util"
)
/**
beedb針對駝峯命名會自動幫你轉化成下劃線字段
例如你定義了Struct名字爲UserInfo,
那麼轉化成 底層實現的時候是user_info,
字段命名也遵循該規則。
*/
type UserInfo struct {
////如果表的主鍵不是id,那麼需要加上pk註釋,顯式的說這個字段是主鍵
Uid int `PK` //`beedb:"PK" sql:"UID" tname:"user_info"`
UserName string `sql:"user_name"`
DepartName string `sql:"depart_name"`
Created string `sql:"created"`
}
func main() {
db, err := sql.Open("mysql","root:root@/test?charset=utf8")
util.CheckError(err)
//beedb的New函數實際上應該有兩個參數,
// 第一個參數標準接口的db,
// 第二個參數是使用的數據庫引擎,如果使用的 數據庫引擎是MySQL/Sqlite,那麼第二個參數都可以省略
orm := beedb.New(db)
//orm := beedb.New(db,"mssql") // SQLServer
//orm := beedb.New(db,"pg") // PostgreSQL
//實現調試
beedb.OnDebug = true
//新增數據
var saveUser UserInfo
saveUser.UserName = "安琪拉"
saveUser.DepartName = "研發部"
saveUser.Created = time.Now().Format("2006-01-02 03:04:05")
err = orm.Save(&saveUser)
if err != nil {
log.Printf("Save Failure : %v", err)
}
//map數據插入
addUser:= make(map[string] interface{})
addUser["user_name"] = "胡安琪"
addUser["depart_name"] = "研發部"
addUser["created"] = "1993-11-23"
_, err = orm.SetTable("user_info").Insert(addUser)
if err != nil {
log.Printf("Insert Failure : %v", err)
}
//批量插入
addOne := make(map[string]interface{})
addTwo := make(map[string]interface{})
addOne["user_name"] = "仙姑"
addOne["depart_name"] = "雲平臺開發"
addOne["created"] = "2012-12-02"
addTwo["user_name"] = "韓湘子"
addTwo["depart_name"] = "雲平臺開發"
addTwo["created"] = "2012-12-02"
addSlice := make([] map[string] interface{},0)
addSlice = append(addSlice, addOne, addTwo)
_, err = orm.SetTable("user_info").InsertBatch(addSlice)
if err != nil {
log.Printf("InsertBatch Failure : %v", err)
}
//更新數據也支持直接使用map操作
t := make(map[string]interface{})
t["user_name"] = "丁凌"
_, err = orm.SetTable("user_info").SetPK("uid").Where(2).Update(t)
if err != nil {
log.Printf("Update Failure : %v", err)
}
//數據查詢
var user UserInfo
err = orm.Where("uid=?",2).Find(&user)
if err != nil {
log.Printf("Find By Primary Key Failure : %v", err)
}
var user2 UserInfo
//可以省略主鍵,主鍵必須是 字段 `id`
//所以這一句一定會執行報錯,是一個坑
err = orm.Where(2).Find(&user2)
if err != nil {
log.Printf("Ignore PrimaryKey Find Failure : %v", err)
}
var user3 UserInfo
err = orm.Where("user_name = ?","丁凌").Find(&user3)
if err != nil {
log.Printf("Find By UserName Failure : %v", err)
}
var user4 UserInfo
err = orm.Where("user_name = ? and created >= ?","丁凌", "1993-11-23").Find(&user4)
if err != nil {
log.Printf("Find By UserName And created Failure : %v", err)
}
var allUser []UserInfo
err = orm.Where("uid > ?",3).FindAll(&allUser)
if err != nil {
log.Printf("Find By Uid Failure : %v", err)
}
err = orm.Where("uid > ?",1).Limit(0,2).FindAll(&allUser)
if err != nil {
log.Printf("Find By Uid And Limit 0, 2 Failure : %v", err)
}
err = orm.Where("uid > ?",1).Limit(2).FindAll(&allUser)
if err != nil {
log.Printf("Find By Uid And Limit Start 2 Failure : %v", err)
}
err = orm.OrderBy("uid desc,user_name desc").FindAll(&allUser)
if err != nil {
log.Printf("Find Order By uid desc,user_name desc Failure : %v", err)
}
//util.CheckError(err)
//FindMap()函數返回的是[]map[string][]byte類型,所以你需要自己作類型轉換。
a, err := orm.SetTable("user_info").SetPK("uid").Where(2).Select("user_name,depart_name").FindMap()
if err != nil {
log.Printf("Find user_name,depart_name By uid Failure : %v", err)
}
for key, value := range a {
fmt.Println(key)
fmt.Println(value)
}
//查詢出來,再刪除
//orm.Delete(&saveUser)
//全部刪除 先查出來
//orm.DeleteAll(&allUser)
//根據SQL刪除
//orm.SetTable("user_info").Where("uid>?", 3).DeleteRow()
}
推薦一個公衆號
號主爲一線大廠架構師,CSDN博客專家,博客訪問量突破一千萬。主要分享Java、golang架構,源碼,分佈式,高併發等技術,用大廠程序員的視角來探討技術進階、面試指南、職業規劃等。15W技術人的選擇!