go學習鞏固知識點(3) 資料庫操作 sql.DB 增刪改查

lai發表於2021-04-11

最近 在看go 的相關學習教程,鞏固一些知識點。
主要 程式碼 來自 《G01 Go 實戰:Web 入門》 學習中的程式碼

資料庫的操作以後一定使用 gorm 類似 laravel的orm ,而類似php一樣,學習好原生的sql寫法基礎,對以後使用orm會起到很大的作用。

go get github.com/go-sql-driver/mysql

var db *sql.DB

func initDB()  {
  var err error
  config := mysql.Config{
  User:                 "root",
  Passwd:               "000000",
  Addr:                 "127.0.0.1:3306",
  Net:                  "tcp",
  DBName:               "goblog",
  AllowNativePasswords: true,
  }

   db, err = sql.Open("mysql", config.FormatDSN())
   checkError(err)

   // 設定最大連線數
  db.SetMaxOpenConns(100)
   // 設定最大空閒連線數
  db.SetMaxIdleConns(25)
   // 設定每個連結的過期時間
  db.SetConnMaxLifetime(5 * time.Minute)

    // 嘗試連線,失敗會報錯
   err = db.Ping()
   checkError(err)
}

main 方法呼叫

...
initDB()
...
func createTables() {
    createArticlesSQL := `CREATE TABLE IF NOT EXISTS articles(
    id bigint(20) PRIMARY KEY AUTO_INCREMENT NOT NULL,
    title varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
    body longtext COLLATE utf8mb4_unicode_ci
); `
    _, err := db.Exec(createArticlesSQL)
    checkError(err)
}

main

...
    createTables()
...
func saveArticleToDB(title string, body string) (int64, error) {
    // 變數初始化
    var (
        id int64
        err error
        rs sql.Result
        stmt *sql.Stmt
    )
    // 1.獲取一個 prepare 宣告
    stmt, err = db.Prepare("INSERT INTO articles (title, body) VALUES(?,?)")
    if err != nil {
        return 0, err
    }

    // 2. 在此函式執行結束後關閉此語句,防止佔用 SQL 連線
    defer stmt.Close()

    // 3. 執行請求,傳參進入繫結的內容
    rs, err = stmt.Exec(title, body)
    if err != nil {
        return 0, err
    }

    // 4. 插入成功的話,會返回自增 ID
    if id, err = rs.LastInsertId(); id > 0 {
        return id, nil
    }

    return 0, err
}
type Article struct {
    Title, Body string
    ID int64
}

func (a Article) Delete() (rowsAffected int64, err error) {
    exec, err := db.Exec("DELETE FROM articles WHERE id = " + strconv.FormatInt(a.ID, 10))
    if err != nil {
        return 0, err
    }

    // √ 刪除成功,跳轉到文章詳情頁
    if n, _ := exec.RowsAffected(); n > 0 {
        return n, nil
    }

    return 0, nil
}

// 使用 Article 的 article.Delete()
    query := "UPDATE articles SET title = ?, body = ? WHERE id = ?"
            rs, err := db.Exec(query, title, body, id)

            if err != nil {
                checkError(err)
                w.WriteHeader(http.StatusInternalServerError)
                fmt.Fprint(w, "500 伺服器內部錯誤")
            }
//單條資料
func getArticleByID(id string) (Article, error) {
   article := Article{}
   query := "SELECT * FROM articles WHERE id = ?"
  err := db.QueryRow(query, id).Scan(&article.ID, &article.Title, &article.Body)
   return article, err
}

//多條資料
rows, err := db.Query("SELECT * from articles")
checkError(err)
defer rows.Close()

//結構體上文有出現過
var articles []Article
//2. 迴圈讀取結果
for rows.Next() {
   var article Article
  // 2.1 掃描每一行的結果並賦值到一個 article 物件中
  err := rows.Scan(&article.ID, &article.Title, &article.Body)
   checkError(err)
   // 2.2 將 article 追加到 articles 的這個陣列中
  articles = append(articles, article)
}
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章