1. 程式人生 > 實用技巧 >golang的mysql基本操作

golang的mysql基本操作

package main

import (
	"database/sql"
	"fmt"
	//"log"
	"strconv"
	"sync"

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

var (
	dbConn *sql.DB
	err    error
)

type SimpleSession struct {
	Username string
	TTL      int64
}

func dbInit() {
	dbConn, err = sql.Open("mysql", "root:root@/video_server?charset=utf8") // "mysql","賬號","密碼"@資料庫名稱?charset=字元編碼
	if err != nil {
		panic(err.Error())
	}
}

func InserSession(sid string, ttl int64, uname string) error {
	ttlstr := strconv.FormatInt(ttl, 10) // 將int型別按10進位制轉化為string
	stmtIns, err := dbConn.Prepare("INSERT INTO sessions (session_id, TTL, login_name) VALUES (?, ?, ?)")
	if err != nil {
		return err
	}

	_, err = stmtIns.Exec(sid, ttlstr, uname)
	if err != nil {
		return err
	}

	defer stmtIns.Close()
	return nil
}

func DeleteSession(sid string) error {
	stmtOut, err := dbConn.Prepare("DELETE FROM sessions WHERE session_id = ?")
	if err != nil {
		return err
	}

	if _, err := stmtOut.Query(sid); err != nil {
		return err
	}

	return nil
}

func UpdateSession(sid string, ttl int64) error {
	stmtOut, err := dbConn.Prepare("UPDATE sessions SET TTL = ? WHERE session_id = ?")
	if err != nil {
		return err
	}

	if _, err := stmtOut.Query(ttl, sid); err != nil {
		return err
	}

	return nil
}

func SelectOne(sid string) (*SimpleSession, error) {
	ss := &SimpleSession{}
	stmtOut, err := dbConn.Prepare("SELECT TTL, login_name FROM sessions WHERE session_id=?")
	if err != nil {
		return nil, err
	}

	var ttl string
	var uname string
	stmtOut.QueryRow(sid).Scan(&ttl, &uname)
	if err != nil && err != sql.ErrNoRows {
		return nil, err
	}

	//將string轉為int64
	if res, err := strconv.ParseInt(ttl, 10, 64); err == nil {
		ss.TTL = res
		ss.Username = uname
	} else {
		return nil, err
	}

	defer stmtOut.Close()
	return ss, nil
}

func SelectAll() (*sync.Map, error) {
	m := &sync.Map{}
	stmtOut, err := dbConn.Prepare("SELECT * FROM sessions")
	if err != nil {
		return nil, err
	}

	rows, err := stmtOut.Query()
	if err != nil {
		return nil, err
	}

	for rows.Next() {
		var id string
		var ttlstr string
		var login_name string
		if er := rows.Scan(&id, &ttlstr, &login_name); er != nil {
			//log.Printf("retrive sessions error: %s", er)
			break
		}
		//出一組資料就打包好往map裡運
		if ttl, err1 := strconv.ParseInt(ttlstr, 10, 64); err1 == nil {
			ss := &SimpleSession{Username: login_name, TTL: ttl}
			m.Store(id, ss)
			//log.Printf(" session id: %s, ttl: %d", id, ss.TTL)
		}
	}
	return m, nil
}

// 新增資料
func InsertData() {
	err := InserSession("8bed7b4f-d201-4ca1-a816-8adce84a9164", 1598602333474, "xiaoming")
	if err != nil {
		fmt.Println(err)
	}
}

// 刪除資料
func DeleteData() {
	err := DeleteSession("8bed7b4f-d201-4ca1-a816-8adce84a9164")
	if err != nil {
		fmt.Println(err)
	}
}

// 修改資料
func UpdateData() {
	err := UpdateSession("8bed7b4f-d201-4ca1-a816-8adce84a9164", 1598602333475)
	if err != nil {
		fmt.Println(err)
	}
}

// 查詢一條資料
func SelectDataOne() {
	ss, err := SelectOne("8bed7b4f-d201-4ca1-a816-8adce84a9163")
	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(ss) // your code
	}
}

// 查詢多條資料 func SelectDataAll() { ss, err := SelectAll() if err != nil { fmt.Println(err) } else { fmt.Println(ss) // your code } } func main() { // 連線資料庫 dbInit() // 增 //InsertData() // 刪 //DeleteData() // 改 //UpdateData() // 查 一條資料 //SelectDataOne() // 查 多條資料 SelectDataAll() }