最近 在看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 協議》,轉載必須註明作者和本文連結