1. 程式人生 > >go語言操作mysql範例(增刪查改)

go語言操作mysql範例(增刪查改)


    go官方僅提供了database package,database package下有兩個包sql,sql/driver。這兩個包用來定義操作資料庫的介面,這就保證了無論使用哪種資料庫,他們的操作方式都是相同的。
    但go官方並沒有提供連線資料庫的driver,如果要操作資料庫,還需要第三方的driver 包,最常用的有:
    https://github.com/Go-SQL-Driver/MySQL支援database/sql,全部採用go寫。
    https://github.com/ziutek/mymysql 支援database/sql,也支援自定義的介面,全部採用go寫。
    推薦使用前者,因為前者的效率更高一點,二者效率的對比可參考benchmark測試結果:
https://github.com/go-sql-driver/sql-benchmark


    go連線其他主流資料庫的驅動介紹可參考:



    作業系統:Red Hat Enterprise Linux Server release 6.4 
    mysql版本:mysql-5.5.28
    安裝git客戶端(方便從github上獲取mysql驅動)
[[email protected] /]# yum install git
    獲取mysql驅動
[[email protected] /]# go get github.com/go-sql-driver/mysql
[[email protected]
/]# ls pkg src
    在當前目錄下可以看到多出兩個資料夾pkg和src,將src資料夾拷貝到go程式安裝目錄下或go工作環境下即可
[[email protected] /]# cp -r src /usr/local/go/
3 程式設計例項
package main

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

func main() {
        /*DSN資料來源名稱
          [username[:password]@][protocol[(address)]]/dbname[?param1=value1¶mN=valueN]
          
[email protected]
(/path/to/socket)/dbname user:[email protected](localhost:5555)/dbname?charset=utf8&autocommit=true user:[email protected]([de:ad:be:ef::ca:fe]:80)/dbname?charset=utf8mb4,utf8 user:[email protected]/dbname 無資料庫: user:[email protected]/ */ db, err := sql.Open("mysql", "jesse:[email protected](127.0.0.1:3306)/?charset=utf8") //第一個引數為驅動名 checkErr(err) db.Query("drop database if exists tmpdb") db.Query("create database tmpdb") //db.Query("use tmpdb") db.Query("create table tmpdb.tmptab(c1 int, c2 varchar(20), c3 varchar(20))") db.Query("insert into tmpdb.tmptab values(101, '姓名1', 'address1'), (102, '姓名2', 'address2'), (103, '姓名3', 'address3'), (104, '姓名4', 'address4')") //checkErr(err) query, err := db.Query("select * from tmpdb.tmptab") checkErr(err) v := reflect.ValueOf(query) fmt.Println(v) fmt.Println("--增加資料測試--") printResult(query) db.Query("delete from tmpdb.tmptab where c1 = 101") //checkErr(err) query2, _ := db.Query("select * from tmpdb.tmptab") fmt.Println("--刪除資料測試--") printResult(query2) db.Query("update tmpdb.tmptab set c3 = 'address4' where c1 = 103") //checkErr(err) query3, _ := db.Query("select * from tmpdb.tmptab") fmt.Println("--更新資料測試--") printResult(query3) db.Query("delete from tmpdb.tmptab") //checkErr(err) query4, _ := db.Query("select * from tmpdb.tmptab") fmt.Println("--清空資料測試--") printResult(query4) db.Query("drop table tmpdb.tmptab") db.Query("drop database tmpdb") //stmt, err := db.Prepare("create database tmpdb") db.Close() } func checkErr(errMasg error) { if errMasg != nil { panic(errMasg) } } func printResult(query *sql.Rows) { column, _ := query.Columns() //讀出查詢出的列欄位名 values := make([][]byte, len(column)) //values是每個列的值,這裡獲取到byte裡 scans := make([]interface{}, len(column)) //因為每次查詢出來的列是不定長的,用len(column)定住當次查詢的長度 for i := range values { //讓每一行資料都填充到[][]byte裡面 scans[i] = &values[i] } results := make(map[int]map[string]string) //最後得到的map i := 0 for query.Next() { //迴圈,讓遊標往下移動 if err := query.Scan(scans...); err != nil { //query.Scan查詢出來的不定長值放到scans[i] = &values[i],也就是每行都放在values裡 fmt.Println(err) return } row := make(map[string]string) //每行資料 for k, v := range values { //每行資料是放在values裡面,現在把它挪到row裡 key := column[k] row[key] = string(v) } results[i] = row //裝入結果集中 i++ } for k, v := range results { //查詢出來的陣列 fmt.Println(k, v) } }
4 執行程式

    4.1 編譯執行

[[email protected] /]# go build MysqlGoTest.go
[[email protected] /]# ls
MysqlGoTest.go  MysqlGoTest
[[email protected] /]# ./MysqlGoTest

4.2 直接執行

[[email protected] /]# go run MysqlGoTest.go
<*sql.Rows Value>
--增加資料測試--
0 map[c1:101 c2:姓名1 c3:address1]
1 map[c1:102 c2:姓名2 c3:address2]
2 map[c1:103 c2:姓名3 c3:address3]
3 map[c1:104 c2:姓名4 c3:address4]
--刪除資料測試--
0 map[c1:102 c2:姓名2 c3:address2]
1 map[c1:103 c2:姓名3 c3:address3]
2 map[c1:104 c2:姓名4 c3:address4]
--更新資料測試--
0 map[c1:102 c2:姓名2 c3:address2]
1 map[c1:103 c2:姓名3 c3:address4]
2 map[c1:104 c2:姓名4 c3:address4]
--清空資料測試--


5 補充知識

    5.1 避免中文亂碼

    為確保程式寫入資料庫以及從資料庫讀出時不出現亂碼,需要做如下配置:
    go客戶端程式級別:
    go程式檔案設定編碼 utf8,如

db, err := sql.Open("mysql", "jesse:[email protected](127.0.0.1:3306)/?charset=utf8")
    mysql資料庫級別:
    設定MySQL資料庫客戶端及服務端配置為utf8 
    例如:
    在my.cnf配置檔案中配置
[mysql]  
default_character_set=utf8  
[mysqld]  
character-set-server=utf8  
collation-server=utf8_bin 

    5.2 go語言反射機制

    用途:可獲取物件資料型別

    很多語言都有反射機制。通過反射,我們可以知道一個未知對像的屬性,方法。

    在寫一個函式的時候,有時你需要另外一個物件或者類的某些屬性,方法,但這個程式不能認識所需要的物件或者類,這時便需要通過反射來操作了。通過反射,你變很方便的載入、探知、使用編譯期間完全未知的物件或者類了。

    所謂反射,也就是相當於物理的反射,你通過鏡子,可以看到自己的摸樣,函式通過反射,可以獲得想要的資訊。在golang的反射包reflect中,反射型別Type()和Value(),可以改變反射回來變數的值。例如獲取變數value的型別,可通過函式reflect.ValueOf()進行操作。

var value interface {} = &User{1,"Tom",12,"nan"}
v := reflect.ValueOf(value)
fmt.Println(v)
 
****************************************************************************************
    原文地址:http://blog.csdn.net/jesseyoung/article/details/40398321
    部落格主頁:http://blog.csdn.net/jesseyoung
****************************************************************************************

相關推薦

go語言操作mysql範例增刪

    go官方僅提供了database package,database package下有兩個包sql,sql/driver。這兩個包用來定義操作資料庫的介面,這就保證了無論使用哪種資料庫,他們的操作方式都是相同的。     但go官方並沒有提供連線資料庫的drive

C語言操作mysql範例增刪

    C程式碼的API是隨MySQL一起釋出的. 它包含在mysqlclient庫中, 可以使C程式來訪問資料庫.     MySQL原始碼包中的許多客戶端都是用C寫的. 如果你正在找使用這些C API的例子, 可以看看客戶端的寫法.你可以在MySQL原始碼包的clie

C語言對位進行操作增刪

利用移位運算、位與、位或,可以查詢、修改某一bit的值。程式如下 #define uchar unsigned char /*測試變數某一位是否為‘1’,是返回真,否返回假,num為待測試的數,bit為位數,其值從0到7,下同*/ uchar bittest(uchar

MySQL學習筆記1增刪

nbsp 之間 values 自動 mon name mes 函數 mar 創建表: /* 創建數據庫 create database 數據庫名; */ CREATE DATABASE mybase; /* 使用數據庫 use 數據庫名 */ US

Java操作MongoDB資料庫CRUD增刪

Java操作MongoDB資料庫CRUD(增刪查改) 藉助mongo-java-driver包,對MongoDB資料庫的集合(DataTable)及文件(BSON物件資料)進行增刪查改操作。本文的核心在於查詢操作,善用mongo-java-driver包下的Iterable迭代器、fin

SQLite.swift —— 例項教程增刪Swift 3

本文介紹下SQLite.swift的基本使用方法,包括與資料庫建立連線、建表、增、刪、查、改,以上基本用法。文中程式碼都是從當前專案中直接粘下來的,並不能直接執行,但是核心的東西都在了。 這個是SQLite.swift的網址,裡面有簡單的介紹(貼上複製到位址列):

Django下mysql資料庫的相關操作建立資料表、以及增刪

如有疑惑或錯誤之處可評論或郵箱聯絡博主:[email protected] 本文主要記錄了在django下使用mysql資料庫時的相關操作,包括建立資料庫、資料表、以及增刪查改。 博主開發環境:Ubuntu16.04,python2.7,d

使用go語言操作mysql資料庫

1.下載並匯入資料庫驅動包 官方不提供實現,先下載第三方的實現,點選這裡檢視各種各樣的實現版本。 這裡選擇了Go-MySQL-Driver這個實現。地址是:https://github.com/go-sql-driver/mysql/。 然後按照裡面的說明下載驅動包: $ go get

資料庫——MySQL增刪、去重,分頁、模糊查詢、排序

新增所有列的記錄:●  語法:insert  into  表名稱  values (值1,值2,值3,...值n);●  例子:insert  into  user  values(‘張三’,‘演員’,22,‘男’);注意:必須把所有列都進行新增,並且新增值的順序需要與建表時

linux下C語言操作mysql資料庫系統自帶版本3.23.54

      我的上一篇blog介紹了在linux環境下如何安裝配置系統自帶的mysql資料庫,並列舉了mysql的一些簡單的操作。接下來我將介紹一下如何利用mysql提供給我們的API來訪問並操作mysql資料庫(C語言)。 首先,我們需要安裝mysql-devel-3.23

mysql mapper中增刪

mysql pro pub epo 增刪 spa count .cn mit //1.增 public int insert(Port port) ; //2.刪 public int deleteM(String id);//3.改 public int update

GO語言的json輸入反序列化之interfac{}存儲

sha hand ace ring mar import float code slice // code_032_json_unmarshal_to_interface project main.go package main import ( "encodin

Java實現對mysql資料庫的增刪

前面我們已經講過如何實現對mysql資料庫的連線。最簡單的資料庫操作就是增刪查改。 其實對懂得實現對資料庫的連線,其餘的,對於一些簡單的操作都是很簡單的。 檢視資料 public static void show_info() throws ClassNotFoundExcept

MongoDB工具類:java操作對檔案的增刪

前言   1.MongoDB,是一個基於分散式檔案儲存的資料庫,是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富、最像關係資料庫的,它的特點是高效能、易部署、易使用,儲存資料非常方便。在實際的專案操作中,我們不僅能用來儲存各種複雜的

JavaEE_ JDBC操作MySQL資料庫 進階篇

JDBC連線資料庫    •建立一個以JDBC連線資料庫的程式,包含7個步驟:     1、載入JDBC驅動程式:               在連線資料庫之前,首先要載入想要連線的資料庫的驅動到JVM(Java虛擬機器),     這通過java.lang.Clas

用C語言實現順序表的增刪和逆置

在資料結構中,我們最開始接觸的就是順序表,那麼順序表是什麼呢?順序表是在計算機記憶體中以陣列的形式儲存的線性表,是指用一組地址連續的儲存單元依次儲存資料元素的線性結構。線性表採用順序儲存的方式儲存就稱之為順序表。順序表是將表中的結點依次存放在計算機記憶體中一組地

C語言實現單鏈表的增刪

連結串列:一種鏈式儲存的線性表,用一組地址任意的儲存單元存放線性表的資料元素,稱儲存單元為一個節點。 連結串列分類: 單鏈表 雙鏈表 雙向迴圈連結串列 程式碼實現單鏈表的增刪查改: linklist.h檔案 #pragma once #incl

c++ map使用增刪遍歷

本文實現數字計數並介紹map的增刪查改遍歷實現. 首先上增刪查改遍歷的程式碼 #include <iostream> #include<map> #include<set> using namespace std; i

(二)mybatis學習之實現對mySQL資料庫的增刪

package com.loren.entity; import org.apache.ibatis.type.Alias; //@Alias()為實體類指定新的別名 @Alias("emp"

Winform連線MySQL資料庫實現增刪功能

       這個練手小專案是今年8月剛接觸C#的時候做的...當時對C#還不熟,邊查資料邊完成的,其實有很多需要優化的地方...資料庫是提前建立好的,使用者名稱密碼什麼的直接寫在點選連線按鈕事件中了,可能未來的某一天想起來這個小專案會回來完善一下 介面