1. 程式人生 > 實用技巧 >Go操作MySQL

Go操作MySQL

連線MySQL

package main

import (
	"database/sql"
	"fmt"

	_ "github.com/go-sql-driver/mysql"
)

// 定義一個全域性物件db
var db *sql.DB

// 定義一個初始化資料庫的函式
func initDB() (err error) {
	// DSN:Data Source Name
	dsn := "root:123456@tcp(localhost:3306)/test_gin?charset=utf8mb4&parseTime=True"
	// 不會校驗賬號密碼是否正確
	// 注意!!!這裡不要使用:=,我們是給全域性變數賦值,然後在main函式中使用全域性變數db
	db, err = sql.Open("mysql", dsn)
	if err != nil {
		return err
	}
	// 嘗試與資料庫建立連線(校驗dsn是否正確)
	err = db.Ping()
	if err != nil {
		return err
	}
	return nil
}

func main() {
	err := initDB() // 呼叫輸出化資料庫的函式
	if err != nil {
		fmt.Printf("init db failed,err:%v\n", err)
		return
	}
}

CRUD

我們先在MySQL中建立一個名為test_gin的資料庫

我們先在MySQL中建立一個名為sql_test的資料庫

CREATE DATABASE sql_test;

進入該資料庫:

use sql_test;

執行以下命令建立一張用於測試的資料表:

CREATE TABLE `user` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(20) DEFAULT '',
    `age` INT(11) DEFAULT '0',
    PRIMARY KEY(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4;

為了方便查詢,我們事先定義好一個結構體來儲存user表的資料。

type user struct {
	id   int
	age  int
	name string
}

單行查詢

單行查詢db.QueryRow()執行一次查詢,並期望返回最多一行結果(即Row)。QueryRow總是返回非nil的值,直到返回值的Scan方法被呼叫時,才會返回被延遲的錯誤。(如:未找到結果)

func (db *DB) QueryRow(query string, args ...interface{}) *Row
/ 查詢單條資料示例
func queryRowDemo() {
	sqlStr := "select id, name, age from user where id=?"
	var u user
	// 非常重要:確保QueryRow之後呼叫Scan方法,否則持有的資料庫連結不會被釋放
	err := db.QueryRow(sqlStr, 1).Scan(&u.id, &u.name, &u.age)
	if err != nil {
		fmt.Printf("scan failed, err:%v\n", err)
		return
	}
	fmt.Printf("id:%d name:%s age:%d\n", u.id, u.name, u.age)
}

參考: https://www.liwenzhou.com/posts/Go/go_mysql/