91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

golang 碎片整理之MySQL

發布時間:2020-06-22 19:06:50 來源:網絡 閱讀:433 作者:霍帥兵 欄目:編程語言

MySQL是常用的關系型數據庫,本文介紹了go語言如何操作MySQL數據庫。

Go操作MySQL

連接

Go語言中的database/sql 包提供了保證SQL或類SQL數據庫的廣泛接口,并不提供具體的數據庫驅動。使用database/sql包時必須注入一個數據庫驅動。

下載依賴

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

使用MySQL驅動

func Open(driverName,dataSourceName string)(*DB,error)

Open打開一個driverName 指定的數據庫,dataSourceName指定數據源,一般包至少包括數據庫文件名和可能的連接信息。

package main

import (
    "database/sql"
)

func main() {
    dsn := "user:password@tcp(127.0.0.1:3306)/dbname"
    db, err := sql.Open("mysql", dsn)
    if err != nil {
        panic(err)
    }
    defer db.Close()
}

初始化連接

Open函數可能只是驗證其參數,而不創建與數據庫的連接。如果要檢查數據源的名稱的合法性,應該調用返回值的ping方法。
返回的DB可以安全的被多個goroutine同時調用,并會維護自身的閑置連接池。這樣一來,Open函數只需要調用一次。很少需要關閉DB.

var db *sql.DB

func initDB() (err error) {
    dsn := "user:password@tcp(127.0.0.1:3306)/test"
    db, err = sql.Open("mysql", dsn)
    if err != nil {
        return err
    }
    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
    }
}

其中的sql.DB 是一個數據庫操作句柄,代表一個具有零到讀個底層連接的連接池。它可以安全的被多個goroutine 同時使用。database/sql 包會自動創建和釋放連接;它也會維護一個閑置的連接池。

SetMaxOpenConns

func (db *DB) SetMaxOpenConns(n int)

SetMaxOpenConns 設置與數據庫建立連接的最大數目。如果n大于0且小于最大閑置連接數,會將最大閑置連接數減小到匹配最大開啟連接數的限制。如果n<=0,不會限制最大開啟連接數,默認是0.

SetMaxIdleConns

func (db *DB)SetMaxIdleConns(n int)

SetMaxIdleConns設置連接池中的最大閑置連接數。如果n大于最大開啟連接數,則新的最大閑置連接數會減小到匹配最大開啟連接數的限制。如果n<=0,不會保留限制連接。

CRUD

建庫建表

我們先在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;

查詢

單行查詢

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

func (db *DB)QueryRow(query string, args ...interface{})*Row

具體示例代碼:

func queryRowDeme() {
    sqlstr := "select id ,name,age from user where id =?"
    var u user
    err := db.QueryRow(sqlstr, 1).Scan(&u.id, &u.name, &u.name)
    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)

}

多行查詢

多行查詢db.Query()執行一次查詢,返回多行結果(即Rows),一般用于執行select命令,參數args表示query中的占位參數。

func (db *DB) Query(query string, args ...interface{}) (*Rows, error)

具體示例代碼:

func queryMultiRowDemo() {
    sqlstr := "select id,name,age from user where id >?"
    rows, err := db.Query(sqlstr, 0)
    if err != nil {
        fmt.Printf("query failed,err:%v\n", err)
        return
    }
    defer rows.Close()
    for rows.Next() {
        var u user
        err := rows.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)
    }
}

插入數據

插入、更新和刪除操作都使用方法:

func (db *DB) Exec(query string, args ...interface{})(Result,err)

Exec執行一次命令(包括查詢,刪除,更新,插入等),返回的Result是對已執行的SQL命令的總結。參數args表示query中的占位參數。
具體插入數據示例代碼如下:

func insertRowDemo(){
    sqlstr := "insert into user(name, age) values (?,?)"
    ret,err :db.Exec(sqlstr,"張一",18)
    if err != nil{
        fmt.Printf("insert failed,err:%v\n",err)
        return
    }

    theID,err := ret.LastInsertId()
    if err != nil{
        fmt.Printf("get lastinsert ID failed,err:%v\n",err)
        return 
    }
    fmt.Printf("insert success,the id is %d.\n",theID)
}

更新數據

具體更新數據示例代碼如下:

func updateRowDemo(){
    sqlstr := "update user set age=? where id =?"
    ret ,err := db.Exec(sqlstr,39,3)
    if err != nil{
        fmt.Printf("update failed,err:%v\n",err)
        return 
    }
    n, err := ret.RowsAffected()
    if err != nil{
        fmt.Printf("get Rowaffected failed,err:%v\n",err)
        return
    }
    fmt.Printf("update success,affected rows:%d\n",n)
}

刪除數據

具體刪除數據的示例代碼如下:

func deleteRowDemo(){
    sqlstr = "delete from user where id =?"
    ret,err := db.Exec(sqlstr,3)
    if err != nil{
        fmt.Printf("delete failed,err:%v\n",err)
        return 
    }
    n ,err := ret.RowsAffected()
    if err != nil{
        fmt.Printf("get RowsAffected failed,err:%v\n",err)
        return
    }
    fmt.Printf("delete success,affected rows:%d\n",n)
}
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

鲁山县| 西乡县| 娄底市| 静宁县| 英吉沙县| 台湾省| 清涧县| 始兴县| 沭阳县| 白城市| 望江县| 孟村| 百色市| 浦城县| 白河县| 黑河市| 纳雍县| 嘉义县| 抚松县| 五莲县| 林周县| 米泉市| 无棣县| 北海市| 和静县| 贵德县| 视频| 西畴县| 新河县| 井陉县| 乐亭县| 贵南县| 惠州市| 陆川县| 南昌市| 固阳县| 岑巩县| 漳浦县| 永宁县| 金溪县| 耿马|