• 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();
    	}
    }
    
  • 相关阅读:
    docx python
    haozip 命令行解压文件
    python 升级2.7版本到3.7
    Pyautogui
    python 库搜索技巧
    sqlserver学习笔记
    vim使用
    三极管工作原理分析
    串口扩展方案+简单自制电平转换电路
    功率二极管使用注意
  • 原文地址:https://www.cnblogs.com/jkko123/p/6873660.html
Copyright © 2020-2023  润新知