Mysql操作
摘要:
參考: golang操作mysql使用總結
建立測試資料表
CREATE TABLE `user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(25) NOT NULL DEFAULT ...
建立測試資料表
CREATE TABLE `user` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(25) NOT NULL DEFAULT '', `age` int(11) NOT NULL DEFAULT '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=utf8
上程式碼
package main import ( // sql.DB 是介面協議,具體的DB操作是通過driver執行 // 但是不能通過driver直接操作,需要通過介面操作,此處匿名引入,自動註冊初始化到sql.DB中 _ "github.com/go-sql-driver/mysql" "database/sql" "fmt" ) /** * DB 連線池 */ type DBWorker struct { Dsn string Db *sql.DB } // 對應資料表字段 type userTB struct { Id int Name sql.NullString// 資料型別設定為 NullXXX,以便讀取時判斷是否賦值 Age sql.NullInt64 } func main(){ var err error dbw := DBWorker{ // 格式大概為:user:password@protocol(ip:port)/database?charset=utf8 Dsn: "root:XXXXXX(@tcp(localhost:3307)/test?charset=utf8", } dbw.Db, err = sql.Open("mysql", dbw.Dsn) if err != nil { panic(err) return } defer dbw.Db.Close() dbw.insertData() dbw.queryData() } // 插入資料測試 func (dbw* DBWorker) insertData(){ stmt, _ := dbw.Db.Prepare(`INSERT INTO user (name, age) VALUES (?, ?)`) defer stmt.Close() ret, err := stmt.Exec("虛無縹緲", 23) if err != nil { fmt.Printf("insert data error:%v\n", err) return } if LastInsertId, err := ret.LastInsertId(); err == nil { fmt.Printf("LastInsertId %d\n", LastInsertId) } if RowsAffected, err := ret.RowsAffected(); err == nil { fmt.Printf("RowsAffected %d\n", RowsAffected) } } // 查詢資料測試 func (dbw *DBWorker) queryData(){ stmt, _ := dbw.Db.Prepare("SELECT * FROM user WHERE age >= ? and age < ?") defer stmt.Close() user := userTB{} rows, err := stmt.Query(20, 30) defer rows.Close() if err != nil { fmt.Printf("query data error : %v\n", err) return; } for rows.Next(){ // SCAN賦值的順序需要與拉取出來的資料一一對應 // 建表時是 id,name,age,此處賦值相對應的為Id, Name, Age err = rows.Scan(&user.Id, &user.Name, &user.Age) if err != nil { fmt.Printf("scan error : %v\n", err) continue } // 執行為空的情形下,給賦值預設值 if !user.Name.Valid { user.Name.String = "" } // 執行為空的情形下,給賦值預設值 if !user.Age.Valid { user.Age.Int64 = 0 } fmt.Println("id: ", user.Id, " name: ", user.Name.String, " age: ", int(user.Age.Int64)) } err = rows.Err() if err != nil { fmt.Printf("rows.Err: %v", err) } }
執行結果
LastInsertId 7 RowsAffected 1 id:1name:aage:25 id:5name:石義波age:23 id:6name:石義波age:23 id:7name:虛無縹緲age:23 Process finished with exit code 0

image.png