日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

基于Go的應(yīng)用開發(fā)

更新時(shí)間:

本文介紹使用Go語言的database/sql包和SQL語句在Lindorm寬表應(yīng)用中進(jìn)行開發(fā)的方法和示例。

前提條件

  • 已安裝GO環(huán)境,建議安裝Go 1.17及以上版本。如何安裝,請(qǐng)參見Go

  • 已開通MySQL協(xié)議兼容功能。如何開通,請(qǐng)參見開通MySQL協(xié)議兼容功能

  • 已將客戶端IP添加至白名單,具體操作請(qǐng)參見設(shè)置白名單

操作步驟

  1. 在Go項(xiàng)目的go.mod文件中,添加Golang MySQL Driver依賴。

    require github.com/go-sql-driver/mysql v1.7.1
  2. 配置連接參數(shù)。

    const ( 
        user = "user"
        password = "test"
        host = "ld-uf6k8yqb741t3****-proxy-sql-lindorm.lindorm.rds.aliyuncs.com"
        port = 33060
        database = "default"
        connectTimeout = "10s"
    )

    參數(shù)說明

    參數(shù)

    說明

    user

    如果您忘記用戶密碼,可以通過Lindorm寬表引擎的集群管理系統(tǒng)修改密碼。具體操作,請(qǐng)參見修改用戶密碼

    password

    host

    Lindorm寬表引擎的MySQL兼容地址。如何獲取,請(qǐng)參見查看連接地址

    重要
    • 如果應(yīng)用部署在ECS實(shí)例,建議您通過專有網(wǎng)絡(luò)訪問Lindorm實(shí)例,可獲得更高的安全性和更低的網(wǎng)絡(luò)延遲。

    • 如果應(yīng)用部署在本地,在通過公網(wǎng)連接Lindorm實(shí)例前,需在控制臺(tái)開通公網(wǎng)地址。開通方式:在控制臺(tái)選擇數(shù)據(jù)庫連接 > 寬表引擎,在寬表引擎頁簽單擊開通公網(wǎng)地址

    • 通過專有網(wǎng)絡(luò)訪問Lindorm實(shí)例,host請(qǐng)?zhí)顚慚ySQL兼容地址對(duì)應(yīng)的專有網(wǎng)絡(luò)地址。通過公網(wǎng)訪問Lindorm實(shí)例,host請(qǐng)?zhí)顚慚ySQL兼容地址對(duì)應(yīng)的公網(wǎng)地址。

    port

    Lindorm寬表引擎MySQL協(xié)議的端口,固定為33060。

    database

    需要連接的數(shù)據(jù)庫名稱。默認(rèn)連接default數(shù)據(jù)庫。

    connectTimeout

    數(shù)據(jù)庫連接的超時(shí)時(shí)間。單位為秒(s)。

  3. 創(chuàng)建連接,通過寬表SQL語法使用Lindorm寬表引擎。以查詢所有數(shù)據(jù)庫為例。

    url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s", user, password, host, port, database, connectTimeout)
    db, err := sql.Open("mysql", url)
    if err != nil {
    	panic(err.Error())
    }
    //設(shè)置可打開連接數(shù)的最大值,默認(rèn)值為0,表示不限制。
    db.SetMaxOpenConns(20)
    //設(shè)置最大閑置連接數(shù), 默認(rèn)值為2。
    db.SetMaxIdleConns(20)
    // 設(shè)置連接的最大空閑時(shí)間,默認(rèn)值為0,表示不超時(shí)。
    db.SetConnMaxIdleTime(8 * time.Minute)
    defer db.Close()
    
    // 獲取數(shù)據(jù)庫中所有的database
    {
    	rows, err := db.Query("show databases")
    	if err != nil {
    		panic(err.Error())
    	}
    	for rows.Next() {
    		var dbName string
    		err := rows.Scan(&dbName)
    		if err != nil {
    			panic(err.Error())
    		}
    		fmt.Println(dbName)
    	}
    }

完整示例

完整示例代碼如下:

package main
import (
    "database/sql"
    "fmt"
    "time"
    _ "github.com/go-sql-driver/mysql"
)
const (
    //user為Lindorm寬表引擎的用戶名
    user = "user"
    //password為Lindorm寬表引擎的密碼
    password = "test"
    //host為Lindorm寬表引擎的MySQL兼容地址
    host = "ld-uf6k8yqb741t3****-proxy-sql-lindorm-public.lindorm.rds.aliyuncs.com"
    //Lindorm寬表引擎MySQL協(xié)議的端口,固定為33060
    port = 33060
    //database為需要連接的數(shù)據(jù)庫名稱
    database = "default"
    //數(shù)據(jù)庫連接的超時(shí)時(shí)間
    connectTimeout = "10s"
)
func main() {
	//打開數(shù)據(jù)庫連接
	url := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?timeout=%s", user, password, host, port, database, connectTimeout)
	db, err := sql.Open("mysql", url)
	if err != nil {
		panic(err.Error())
	}
	//設(shè)置可打開連接數(shù)的最大值,默認(rèn)值為0,表示不限制
	db.SetMaxOpenConns(20)
	//設(shè)置最大閑置連接數(shù), 默認(rèn)值為2
	db.SetMaxIdleConns(20)
	//設(shè)置連接的最大空閑時(shí)間,默認(rèn)值為0,表示不超時(shí)
	db.SetConnMaxIdleTime(8 * time.Minute)
	defer db.Close()

	//獲取數(shù)據(jù)庫中所有的database
	{
		rows, err := db.Query("show databases")
		if err != nil {
			panic(err.Error())
		}
		for rows.Next() {
			var dbName string
			err := rows.Scan(&dbName)
			if err != nil {
				panic(err.Error())
			}
			fmt.Println(dbName)
		}
	}

	//創(chuàng)建表
	{
		_, err := db.Exec("create table if not exists user_test(id int, name varchar,age int, primary key(id))")
		if err != nil {
			fmt.Println("create table error ", err)
			return
		}
	}

	//寫入數(shù)據(jù)

	//寫入方法一:直接寫入數(shù)據(jù)。
	{
		_, err = db.Exec("upsert into user_test(id,name,age) values(1,'zhangsan',17)")
		if err != nil {
			fmt.Println("insert data error", err)
			return
		}
	}

	//寫入方法二:通過綁定參數(shù)的方式進(jìn)行寫入數(shù)據(jù)。
	{
		stmt, err := db.Prepare("upsert into user_test(id,name,age) values(?,?,?)")
		if err != nil {
			fmt.Println("prepare error", err)
			return
		}
		_, err = stmt.Exec(2, "lisi", 18)
		if err != nil {
			fmt.Println("upsert error", err)
			return
		}
	}

	//查詢數(shù)據(jù)

	//查詢方法一:直接查詢數(shù)據(jù)。

	{
		rows, err := db.Query("select * from user_test")
		if err != nil {
			fmt.Println("query data error", err)
			return
		}
		defer rows.Close()
		var id int
		var name string
		var age int
		for rows.Next() {
			err = rows.Scan(&id, &name, &age)
			if err != nil {
				fmt.Println("scan data error", err)
				return
			}
			fmt.Println("id:", id, "name:", name, "age:", age)
		}
	}

	// 查詢方法二:通過綁定參數(shù)的方式執(zhí)行參數(shù)化查詢。
	{
		stmt, err := db.Prepare("select * from user_test where id=?")
		if err != nil {
			fmt.Println("prepare error", err)
			return
		}
		rows, err := stmt.Query(1)
		if err != nil {
			fmt.Println("query data error", err)
			return
		}
		defer rows.Close()
		var id int
		var name string
		var age int
		for rows.Next() {
			err = rows.Scan(&id, &name, &age)
			if err != nil {
				fmt.Println("scan data error", err)
				return
			}
			fmt.Println("id:", id, "name:", name, "age:", age)
		}
	}

	//刪除數(shù)據(jù)
	{
		_, err = db.Exec("delete from user_test where id=1")
		if err != nil {
			fmt.Println("delete data error", err)
			return
		}
	}
}

如果當(dāng)前實(shí)例僅有default一個(gè)數(shù)據(jù)庫,執(zhí)行成功后將返回如下結(jié)果:

default
information_schema
id: 1 name: zhangsan age: 17
id: 2 name: lisi age: 18