0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Golang連接MySQL

馬哥Linux運(yùn)維 ? 來源:51CTO ? 2024-01-08 09:42 ? 次閱讀

Go連接MySQL

首先我們來看如何使用Golang連接MySQL

安裝所需要的驅(qū)動

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

導(dǎo)入所需要使用的包

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

連接MySQL需要使用的語句

func main() {
    //"用戶名:密碼@[連接方式](主機(jī)名:端口號)/數(shù)據(jù)庫名"
    db, _ := sql.Open("mysql", "root:pwd@(localhost)/database") // 設(shè)置連接數(shù)據(jù)庫的參數(shù)
    defer db.Close()                                            //關(guān)閉數(shù)據(jù)庫
    err := db.Ping()                                            //連接數(shù)據(jù)庫
    if err != nil {
        fmt.Println("Open database fail !")                             //連接失敗
        return
    }
    fmt.Println("Connection succdess !")                             //連接成功
}

案例演示

建表

先在MySQL中創(chuàng)建一個名為test的數(shù)據(jù)庫,在此數(shù)據(jù)庫中創(chuàng)建一個user表,包含五個字段id, name, age, sex, phone,并插入幾條數(shù)據(jù),推薦使用 Navicat等圖形化管理工具,不用麻煩地在 MySQL 命令行寫SQL語句。表如下:

1bae6982-ad48-11ee-8b88-92fbcf53809c.jpg

連接MySQL

將數(shù)據(jù)庫的相關(guān)配置寫成常量,創(chuàng)建InitDB函數(shù)用于連接數(shù)據(jù)庫,創(chuàng)建Query函數(shù)用于查詢數(shù)據(jù),全部代碼如下:

package main


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


// 數(shù)據(jù)庫配置
const (
  userName = "root"
  password = "******"
  ip       = "127.0.0.1"
  port     = "3306"
  dbName   = "test"
)


// Db數(shù)據(jù)庫連接池
var DB *sql.DB


type User struct {
  id    int64
  name  string
  age   int8
  sex   int8
  phone string
}


// 注意方法名大寫,就是public
func InitDB() {
  //構(gòu)建連接:"用戶名:密碼@tcp(IP:端口)/數(shù)據(jù)庫?charset=utf8"
  path := strings.Join([]string{userName, ":", password, "@tcp(", ip, ":", port, ")/", dbName, "?charset=utf8"}, "")
  //打開數(shù)據(jù)庫,前者是驅(qū)動名,所以要導(dǎo)入: _ "github.com/go-sql-driver/mysql"
  DB, _ = sql.Open("mysql", path)
  //設(shè)置數(shù)據(jù)庫最大連接數(shù)
  DB.SetConnMaxLifetime(100)
  //設(shè)置上數(shù)據(jù)庫最大閑置連接數(shù)
  DB.SetMaxIdleConns(10)
  //驗證連接
  if err := DB.Ping(); err != nil {
    fmt.Println("open database fail !")
    return
  }
  fmt.Println("connnection success !")
}


// 查詢操作
func Query() {
  var user User
  rows, e := DB.Query("select * from user where id in (1,2,3)")
  if e == nil {
    errors.New("query incur error")
  }
  for rows.Next() {
    e := rows.Scan(&user.sex, &user.phone, &user.name, &user.id, &user.age)
    if e != nil {
      fmt.Println(user.sex, user.phone, user.name, user.id, user.age)
    }
  }
  rows.Close()
}


func main() {
  InitDB()
  Query()
  defer DB.Close()
}

以上是使用Golang連接MySQL數(shù)據(jù)庫的基礎(chǔ)方法,接下來我們看Gorm是如何連接MySQL。

Gorm

什么是ORM

對象關(guān)系映射 :Object-Relational Mapping,用于在關(guān)系數(shù)據(jù)庫和面向?qū)ο?a target="_blank">編程語言的堆之間轉(zhuǎn)換數(shù)據(jù)。這樣就創(chuàng)建了一個虛擬的對象數(shù)據(jù)庫,可以從編程語言內(nèi)部使用。

ORM提供了自動支持,用于將元組映射到對象并返回,同時考慮所有這些差異。問題的核心在于將對象的邏輯表示轉(zhuǎn)換為能夠存儲在數(shù)據(jù)庫中的原子形式,同時保留對象的屬性和它們之間的關(guān)系,以便在需要時可以重新加載為對象。如果實現(xiàn)了這種存儲和檢索功能,則稱這些對象是持久的。

優(yōu)點

提高開發(fā)效率,減少開發(fā)成本

使開發(fā)更加面向?qū)ο?/p>

可移植性

可以輕松引入額外功能,如數(shù)據(jù)緩存。

加快開發(fā)速度 - 消除了重復(fù)的SQL代碼的需要。

減少開發(fā)時間、成本

克服特定于供應(yīng)商的SQL差異 - ORM知道如何編寫特定于供應(yīng)商的SQL

缺點

在學(xué)習(xí)使用ORM時會損失生產(chǎn)力

失去了對代碼實際執(zhí)行內(nèi)容的理解 - 使用SQL時,開發(fā)人員更能控制

ORM有變慢的傾向

ORM無法與復(fù)雜查詢的SQL查詢競爭

Grom介紹

Gorm是一種功能強(qiáng)大且對開發(fā)人員友好的ORM庫,支持主流的數(shù)據(jù)庫。

GORM 官方支持的數(shù)據(jù)庫類型有:MySQL, PostgreSQL, SQLite, SQL Server 和 TiDB

安裝

go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql

連接MySQL

和基本的連接方法區(qū)別不大

import (
  "gorm.io/driver/mysql"
  "gorm.io/gorm"
)


func main() {
  dsn := "user:pass@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"
  db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
}

**注意:**想要正確的處理time.Time,您需要帶上parseTime參數(shù), (更多參數(shù)) 要支持完整的 UTF-8 編碼,您需要將charset=utf8更改為charset=utf8mb4查看此文章獲取詳情

GORM MODEL 定義

在使用ORM工具時,我們需要在代碼中定義模型(Models)與數(shù)據(jù)庫中的數(shù)據(jù)表進(jìn)行映射,模型是標(biāo)準(zhǔn)的 struct,由 Go 的基本數(shù)據(jù)類型、實現(xiàn)了Scanner和Valuer接口的自定義類型及其指針或別名組成

約定

GORM 傾向于約定優(yōu)于配置 默認(rèn)情況下,GORM 使用ID作為主鍵,使用結(jié)構(gòu)體名的蛇形復(fù)數(shù)作為表名,字段名的蛇形作為列名,并使用CreatedAt、UpdatedAt字段追蹤創(chuàng)建、更新時間

如果您遵循 GORM 的約定,您就可以少寫的配置、代碼。如果約定不符合您的實際要求, GORM 允許你配置它們

gorm.Model

GORM 定義一個gorm.Model結(jié)構(gòu)體,其包括字段ID、CreatedAt、UpdatedAt、DeletedAt

// gorm.Model 的定義
type Model struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
}

您也可以將其嵌入到自己的結(jié)構(gòu)體當(dāng)中,如下:

type User struct {
  gorm.Model
  Name string
}
// 等效于
type User struct {
  ID        uint           `gorm:"primaryKey"`
  CreatedAt time.Time
  UpdatedAt time.Time
  DeletedAt gorm.DeletedAt `gorm:"index"`
  Name string
}

當(dāng)然您也可以完全使用自己定義的結(jié)構(gòu)體,不一定需要使用它的model

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)庫
    +關(guān)注

    關(guān)注

    7

    文章

    3752

    瀏覽量

    64233
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4277

    瀏覽量

    62323
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    797

    瀏覽量

    26399
  • GitHub
    +關(guān)注

    關(guān)注

    3

    文章

    465

    瀏覽量

    16359

原文標(biāo)題:Go操作數(shù)據(jù)庫與Gorm講解

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何在Rust中連接和使用MySQL數(shù)據(jù)庫

    如何在Rust中連接和使用MySQL數(shù)據(jù)庫。 安裝 mysql 模塊 這里我們假設(shè)你已經(jīng)安裝了Rust編程語言工具鏈,在本教程中,我們將使用 mysql crate來
    的頭像 發(fā)表于 09-30 17:05 ?1576次閱讀

    labview 連接mysql 數(shù)據(jù)庫的問題

    `我根據(jù)網(wǎng)絡(luò)上的教程想用labsql 做個連接mysql的vi,但是就是連接不上數(shù)據(jù)庫。(已經(jīng)新建數(shù)據(jù)源DSN)求教下,字符串 3,4 是不是哪里寫錯了? 后面的程序部分有問題嗎?本人初學(xué),謝謝DSN=mysqldriver是
    發(fā)表于 01-07 22:06

    labview連接mysql數(shù)據(jù)庫失敗,原因何在。

    `使用ODBC連接mysql時,測試連接成功;但是使用labview連接mysql時,測試連接
    發(fā)表于 11-29 17:02

    采用hqC連接mysql數(shù)據(jù)庫

    eclipse連接mysql(80)的版本問題
    發(fā)表于 04-30 10:27

    Labview連接Mysql學(xué)習(xí)筆記分享

    論壇上有很多分享Labview與access連接的資料。但是對于MySQL則比較少,尤其是連接遠(yuǎn)程的MySQL.MySQL由于其免費(fèi)性和高效性,被廣泛使用。學(xué)會如何
    發(fā)表于 06-04 16:27

    Golang怎么實現(xiàn)UTS隔離

    Golang實現(xiàn)UTS隔離
    發(fā)表于 08-23 14:44

    Golang調(diào)用MySQL存儲過程解析

    Golang 調(diào)用MySQL存儲過程
    發(fā)表于 06-05 17:42

    如何使用原生hqc連接MySQL數(shù)據(jù)庫

    springboot項目中使用原生hqc連接MySQL數(shù)據(jù)庫
    發(fā)表于 06-08 12:12

    c#如何連接mysql數(shù)據(jù)庫

    (visual studio)c#連接mysql數(shù)據(jù)庫
    發(fā)表于 06-13 20:56

    mysql數(shù)據(jù)導(dǎo)出golang實現(xiàn)

    mysql數(shù)據(jù)導(dǎo)出為excel文件,golang實現(xiàn):首先下載依賴到的三方庫:Simple install the package to your $GOPATH
    發(fā)表于 10-21 15:14

    ESP8266如何連接mysql數(shù)據(jù)庫

    各位大神,我試圖用ESP8266 連接mysql ,將溫濕度傳感器的數(shù)據(jù),寫入數(shù)據(jù)庫。mysql數(shù)據(jù)庫已建好,在局域網(wǎng)中的其他電腦也可以正常訪問;Arduino中是有mysql con
    發(fā)表于 01-12 09:22

    初探Golang內(nèi)聯(lián)

    今天我們來聊聊 Golang 中的內(nèi)聯(lián)。
    的頭像 發(fā)表于 12-13 09:51 ?895次閱讀

    GoLang的安裝和使用

    GoLang的安裝和使用
    的頭像 發(fā)表于 01-13 14:06 ?1239次閱讀
    <b class='flag-5'>GoLang</b>的安裝和使用

    【芒果派MangoPi MQ Quad】使用Golang點燈

    使用Golang在芒果派上點燈
    的頭像 發(fā)表于 07-21 14:44 ?654次閱讀
    【芒果派MangoPi MQ Quad】使用<b class='flag-5'>Golang</b>點燈

    eclipse怎么連接數(shù)據(jù)庫mysql

    連接Eclipse和MySQL數(shù)據(jù)庫可以通過JDBC(Java Database Connectivity)來實現(xiàn)。以下是詳細(xì)步驟: 下載并安裝MySQL數(shù)據(jù)庫:你首先需要下載并安裝MySQL
    的頭像 發(fā)表于 12-06 11:06 ?1172次閱讀