go語言中操作mysql的方法


需要下載指定的golang的mysql驅動包

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

下面的例子:

package main;

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

func main() {
	//打開數據庫
	//DSN數據源字符串:用戶名:密碼@協議(地址:端口)/數據庫?參數=參數值
	db, err := sql.Open("mysql", "root:@tcp(127.0.0.1:3306)/test?charset=utf8");
	if err != nil {
		fmt.Println(err);
	}

	//關閉數據庫,db會被多個goroutine共享,可以不調用
	defer db.Close();

	//查詢數據,指定字段名,返回sql.Rows結果集
	rows, _ := db.Query("select id,name from test");
	id := 0;
	name := "";
	for rows.Next() {
		rows.Scan(&id, &name);
		fmt.Println(id, name);
	}

	//查詢數據,取所有字段
	rows2, _ := db.Query("select * from test");
	//返回所有列
	cols, _ := rows2.Columns();
	//這里表示一行所有列的值,用[]byte表示
	vals := make([][]byte, len(cols));
	//這里表示一行填充數據
	scans := make([]interface{}, len(cols));
	//這里scans引用vals,把數據填充到[]byte里
	for k, _ := range vals {
		scans[k] = &vals[k];
	}

	i := 0;
	result := make(map[int]map[string]string);
	for rows2.Next() {
		//填充數據
		rows2.Scan(scans...);
		//每行數據
		row := make(map[string]string);
		//把vals中的數據復制到row中
		for k, v := range vals {
			key := cols[k];
			//這里把[]byte數據轉成string
			row[key] = string(v);
		}
		//放入結果集
		result[i] = row;
		i++;
	}
	fmt.Println(result);

	//查詢一行數據
	rows3 := db.QueryRow("select id,name from test where id = ?", 1);
	rows3.Scan(&id, &name);
	fmt.Println(id, name);

	//插入一行數據
	ret, _ := db.Exec("insert into test(id,name) values(null, '444')");
	//獲取插入ID
	ins_id, _ := ret.LastInsertId();
	fmt.Println(ins_id);

	//更新數據
	ret2, _ := db.Exec("update test set name = '000' where id > ?", 2);
	//獲取影響行數
	aff_nums, _ := ret2.RowsAffected();
	fmt.Println(aff_nums);

	//刪除數據
	ret3, _ := db.Exec("delete from test where id = ?", 3);
	//獲取影響行數
	del_nums, _ := ret3.RowsAffected();
	fmt.Println(del_nums);

	//預處理語句
	stmt, _ := db.Prepare("select id,name from test where id = ?");
	rows4, _ := stmt.Query(3);
	//注意這里需要Next()下,不然下面取不到值
	rows4.Next();
	rows4.Scan(&id, &name);
	fmt.Println(id, name);

	stmt2, _ := db.Prepare("insert into test values(null, ?, ?)");
	rows5, _ := stmt2.Exec("666", 66);
	fmt.Println(rows5.RowsAffected());

	//事務處理
	tx, _ := db.Begin();

	ret4, _ := tx.Exec("update test set price = price + 100 where id = ?", 1);
	ret5, _ := tx.Exec("update test set price = price - 100 where id = ?", 2);
	upd_nums1, _ := ret4.RowsAffected();
	upd_nums2, _ := ret5.RowsAffected();

	if upd_nums1 > 0 && upd_nums2 > 0 {
		//只有兩條更新同時成功,那么才提交
		tx.Commit();
	} else {
		//否則回滾
		tx.Rollback();
	}
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM