<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### gorm 用法介紹 #### 庫安裝 ~~~ go get -u github.com/jinzhu/gorm ~~~ #### 數據庫連接 ~~~ import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" ) var db *gorm.DB func init() { var err error db, err = gorm.Open("mysql", "<user>:<password>/<database>?charset=utf8&parseTime=True&loc=Local") if err != nil { panic(err) } } ~~~ 連接比較簡單,直接調用 `gorm.Open` 傳入數據庫地址即可 `github.com/jinzhu/gorm/dialects/mysql` 是 golang 的 mysql 驅動,實際上就是 `github.com/go-sql-driver/mysql` 作者這里為了好記,重新弄了個名字 這里我用的 mysql,實際上支持基本上所有主流的關系數據庫,連接方式上略有不同 ~~~ db.DB().SetMaxIdleConns(10) db.DB().SetMaxOpenConns(100) ~~~ 還可以使用 `db.DB()` 對象設置連接池信息 #### 表定義 先來定義一個點贊表,這里面一條記錄表示某個用戶在某個時刻對某篇文章點了一個贊,用 ip + ua 來標識用戶,title 標識文章標題 ~~~ type Like struct { ID int `gorm:"primary_key"` Ip string `gorm:"type:varchar(20);not null;index:ip_idx"` Ua string `gorm:"type:varchar(256);not null;"` Title string `gorm:"type:varchar(128);not null;index:title_idx"` Hash uint64 `gorm:"unique_index:hash_idx;"` CreatedAt time.Time } ~~~ gorm 用 tag 的方式來標識 mysql 里面的約束 創建索引只需要直接指定列即可,這里創建了兩個索引,`ip_idx` 和 `title_idx`;如果需要多列組合索引,直接讓索引的名字相同即可;如果需要創建唯一索引,指定為 `unique_index` 即可 支持時間類型,直接使用 `time.Time` 即可 #### 創建表 ~~~ if !db.HasTable(&Like{}) { if err := db.Set("gorm:table_options", "ENGINE=InnoDB DEFAULT CHARSET=utf8").CreateTable(&Like{}).Error; err != nil { panic(err) } } ~~~ 直接通過 `db.CreateTable` 就可以創建表了,非常方便,還可以通過 `db.Set` 設置一些額外的表屬性 #### 插入 ~~~ like := &Like{ Ip: ip, Ua: ua, Title: title, Hash: murmur3.Sum64([]byte(strings.Join([]string{ip, ua, title}, "-"))) >> 1, CreatedAt: time.Now(), } if err := db.Create(like).Error; err != nil { return err } ~~~ 先構造已給對象,直接調用 `db.Create()` 就可以插入一條記錄了 #### 刪除 ~~~ if err := db.Where(&Like{Hash: hash}).Delete(Like{}).Error; err != nil { return err } ~~~ 先用 `db.Where()` 構造查詢條件,再調用 `db.Delete()` 就可以刪除 #### 查詢 ~~~ var count int err := db.Model(&Like{}).Where(&Like{Ip: ip, Ua: ua, Title: title}).Count(&count).Error if err != nil { return false, err } ~~~ 先用 `db.Model()` 選擇一個表,再用 `db.Where()` 構造查詢條件,后面可以使用 `db.Count()` 計算數量,如果要獲取對象,可以使用 `db.Find(&Likes)` 或者只需要查一條記錄 `db.First(&Like)` #### 修改 ~~~ db.Model(&user).Update("name", "hello") db.Model(&user).Updates(User{Name: "hello", Age: 18}) db.Model(&user).Updates(User{Name: "", Age: 0, Actived: false}) // nothing update ~~~ 我這個系統里面沒有更新需求,這幾個例子來自于官網,第一個是更新單條記錄;第二個是更新整條記錄,注意只有非空字段才會更新;第三個例子是不會更新的,在系統設計的時候要盡量避免這些空值有特殊的含義,如果一定要更新,可以使用第一種方式,設置單個值 #### 錯誤處理 其實你已經看到了,這里基本上所有的函數都是鏈式的,全部都返回 `db` 對象,任何時候調用 `db.Error` 就能獲取到錯誤信息,非常方便 #### 事務 ~~~ func CreateAnimals(db *gorm.DB) err { tx := db.Begin() if err := tx.Create(&Animal{Name: "Giraffe"}).Error; err != nil { tx.Rollback() return err } if err := tx.Create(&Animal{Name: "Lion"}).Error; err != nil { tx.Rollback() return err } tx.Commit() return nil } ~~~ 事務的處理也很簡單,用 `db.Begin()` 聲明開啟事務,結束的時候調用 `tx.Commit()`,異常的時候調用 `tx.Rollback()` #### 其他 還可以使用如下方式設置日志輸出級別以及改變日志輸出地方 ~~~ db.LogMode(true) db.SetLogger(gorm.Logger{revel.TRACE}) db.SetLogger(log.New(os.Stdout, "\r\n", 0)) ~~~ 也支持普通的 sql,但是建議盡量不要使用 作者:hatlonely 鏈接:https://www.jianshu.com/p/f7419395e4cc 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看