Go操作MySQL
阿新 • • 發佈:2020-11-19
連線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) }