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 协议》,转载必须注明作者和本文链接