go学习巩固知识点(3) 数据库操作 sql.DB 增删改查

最近 在看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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!