1. 程式人生 > 其它 >golang操作mysql簡單例子

golang操作mysql簡單例子

==表結構==

CREATE TABLE `point_info` (
    `id` BIGINT(19) NOT NULL COMMENT '自增ID',
    `product_key` VARCHAR(50) NOT NULL COMMENT '產品標識' COLLATE 'utf8mb4_general_ci',
    `device_name` VARCHAR(50) NOT NULL COMMENT '裝置名稱' COLLATE 'utf8mb4_general_ci',
    `point_id` VARCHAR(50) NOT NULL COMMENT '測點ID' COLLATE '
utf8mb4_general_ci', PRIMARY KEY (`id`) USING BTREE ) COMMENT='測點資訊' COLLATE='utf8mb4_general_ci' ENGINE=InnoDB ;

 

==下載依賴==

go get github.com/go-sql-driver/mysql

 

 

==程式碼樣例==

package main

import (
    "database/sql"
    "fmt"
    _ "github.com/go-sql-driver/mysql"
    "time"
)

var MysqlDb *sql.DB
var MysqlDbErr error

type PointInfo struct {
    Id         int64  `db:
"id"` ProductKey string `db:"product_key"` DeviceName string `db:"device_name"` PointId string `db:"point_id"` } const ( USER_NAME = "root" PASS_WORD = "root" HOST = "xx.xx.xx.xx" PORT = "3306" DATABASE = "pulse" CHARSET = "utf8" ) // 初始化連結 func init() { dbDSN :
= fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s", USER_NAME, PASS_WORD, HOST, PORT, DATABASE, CHARSET) // 開啟連線失敗 MysqlDb, MysqlDbErr = sql.Open("mysql", dbDSN) //defer MysqlDb.Close(); if MysqlDbErr != nil { fmt.Println("dbDSN: " + dbDSN) panic("資料來源配置不正確: " + MysqlDbErr.Error()) } // 最大連線數 MysqlDb.SetMaxOpenConns(100) // 閒置連線數 MysqlDb.SetMaxIdleConns(20) // 最大連線週期 MysqlDb.SetConnMaxLifetime(100 * time.Second) if MysqlDbErr = MysqlDb.Ping(); nil != MysqlDbErr { panic("資料庫連結失敗: " + MysqlDbErr.Error()) } } func main() { // 插入資料 id := StructInsert() // 查詢指定資料 StructQueryField(id) // 查詢所有資料 StructQueryAllField() // 更新資料 StructUpdate(id) // 刪除資料 StructDel(id) } // StructQueryField 查詢資料,指定欄位名 func StructQueryField(id int64) { var sqlStr = "SELECT id, product_key, device_name, point_id FROM point_info WHERE id = ?" row := MysqlDb.QueryRow(sqlStr, id) pointInfo := new(PointInfo) err := row.Scan(&pointInfo.Id, &pointInfo.ProductKey, &pointInfo.DeviceName, &pointInfo.PointId) if err != nil { fmt.Printf("scan failed, err:%v", err) return } fmt.Println(pointInfo.Id, pointInfo.ProductKey, pointInfo.DeviceName, pointInfo.PointId) } // StructQueryAllField 查詢資料,取所有欄位 func StructQueryAllField() { var sqlStr = "SELECT * FROM point_info limit ?" rows, err := MysqlDb.Query(sqlStr, 10) if err != nil { fmt.Println(err.Error()) return } // 通過切片儲存 pointInfos := make([]PointInfo, 0) // 遍歷 var pointInfo PointInfo for rows.Next() { err := rows.Scan(&pointInfo.Id, &pointInfo.ProductKey, &pointInfo.DeviceName, &pointInfo.PointId) if err != nil { fmt.Println(err.Error()) return } pointInfos = append(pointInfos, pointInfo) } fmt.Println(pointInfos) } // StructInsert 插入資料 func StructInsert() int64 { var sqlStr = "insert INTO point_info(product_key, device_name, point_id) values(?, ?, ?)" ret, err := MysqlDb.Exec(sqlStr, "product1", "device1", "point1") if err != nil { fmt.Println(err.Error()) return 0 } lastInsertID, err := ret.LastInsertId() if err != nil { fmt.Println(err.Error()) return 0 } fmt.Println("插入資料主鍵 LastInsertID:", lastInsertID) rowsAffected, err := ret.RowsAffected() if err != nil { fmt.Println(err.Error()) return 0 } fmt.Println("插入影響行數 RowsAffected:", rowsAffected) return lastInsertID } // StructUpdate 更新資料 func StructUpdate(id int64) { var sqlStr = "UPDATE point_info set product_key = ?, device_name = ?, point_id = ? where id = ?" ret, err := MysqlDb.Exec(sqlStr, "product2", "device2", "point2", id) if err != nil { fmt.Println(err.Error()) return } updNums, err := ret.RowsAffected() if err != nil { fmt.Println(err.Error()) return } fmt.Println("更新影響行數 RowsAffected:", updNums) } // StructDel 刪除資料 func StructDel(id int64) { var sqlStr = "delete from point_info where id = ?" ret, err := MysqlDb.Exec(sqlStr, id) if err != nil { fmt.Println(err.Error()) return } delNums, err := ret.RowsAffected() if err != nil { fmt.Println(err.Error()) return } fmt.Println("刪除影響行數 RowsAffected:", delNums) }