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測試結果:
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.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#還不熟,邊查資料邊完成的,其實有很多需要優化的地方...資料庫是提前建立好的,使用者名稱密碼什麼的直接寫在點選連線按鈕事件中了,可能未來的某一天想起來這個小專案會回來完善一下 介面