原文地址:http://www.niu12.com/article/35
初次學go,在了解一些基礎之后就開始做一個用戶的增刪改查來回顧知識,有很多數據驗證和安全漏洞並沒有考慮,只當作聯系
前提:下載mysql驅動
a.go get github.com/go-sql-driver/mysql
b.數據表結構
-- ----------------------------
-- Table structure for users
-- ----------------------------
DROP TABLE IF EXISTS `users`;
CREATE TABLE `users` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL COMMENT '姓名',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of users
-- ----------------------------
INSERT INTO `users` VALUES ('1', '卡牌');
INSERT INTO `users` VALUES ('2', 'card');
INSERT INTO `users` VALUES ('3', '周起');
INSERT INTO `users` VALUES ('4', '有的人');
1.目錄結構
| tpl --------模板文件
|-----create.html --------創建頁面
|-----list.html --------列表頁面
|-----update.html --------更新頁面
| handlers.go --------業務邏輯處理(增刪改查)
| main.go --------入口文件(路由控制)
| models.go --------模型文件(映射數據表)
2.main.go
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
"log"
"net/http"
"os"
)
var (
db *sql.DB
err error
)
/**
檢測錯誤,拋出異常
*/
func checkError(err error) {
if err != nil {
panic(err)
}
}
func main() {
db, err = sql.Open("mysql", "root:123456@tcp(47.97.215.189 )/test?charset=utf8")
checkError(err)
defer db.Close()
// 測試連接
err = db.Ping()
checkError(err)
os.Setenv("PORT", "8888")
port := os.Getenv("PORT")
if port == "" {
log.Fatal("服務器端口號未設置")
}
// 路由
// 用戶列表
http.HandleFunc("/", listHandle)
http.HandleFunc("/list", listHandle)
// 添加用戶
http.HandleFunc("/create", createHandle)
//// 更新用戶
http.HandleFunc("/update", updateHandle)
//// 刪除用戶
http.HandleFunc("/delete", deleteHandle)
// 監聽端口
http.ListenAndServe(":"+port, nil)
}
3.handlers.go
package main
import (
"html/template"
"net/http"
)
// 用戶列表
func listHandle(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
http.Error(w, "請求方式錯誤", http.StatusMethodNotAllowed)
}
rows, err := db.Query("SELECT * FROM users")
if err != nil {
panic(err)
}
var users []User
var user User
for rows.Next() {
err = rows.Scan(&user.Id
, &user.Username)
users = append(users, user)
}
t, err := template.New("list.html").ParseFiles("tpl/list.html")
err = t.Execute(w, users)
if err != nil {
panic(err)
}
}
// 創建用戶
func createHandle(w http.ResponseWriter, r *http.Request) {
if r.Method == "GET" {
t, err := template.New("create.html").ParseFiles("tpl/create.html")
if err != nil {
panic(err)
}
t.Execute(w,nil)
}
if r.Method == "POST" {
r.ParseForm()
username := r.Form["username"][0]
stmt, err := db.Prepare("INSERT INTO users(username) VALUES(?)")
if err != nil {
panic(err)
}
_, err = stmt.Exec(username)
if err != nil{
panic(err)
}
http.Redirect(w, r, "/list", 301)
}
}
// 修改用戶信息
func updateHandle(w http.ResponseWriter, r *http.Request) {
r.ParseForm()
if r.Method == "GET" {
id := r.Form["id"][0]
var user User
row := db.QueryRow("SELECT * FROM users WHERE id = ?", id)
row.Scan(&user.Id , &user.Username)
t, err := template.New("update.html").ParseFiles("tpl/update.html")
if err != nil {
panic(err)
}
t.Execute(w, user)
}
if r.Method == "POST" {
id := r.Form["id"][0]
username := r.Form["username"][0]
stmt, err := db.Prepare("UPDATE users SET username = ? WHERE id = ?")
if err != nil {
panic(err)
}
_,err = stmt.Exec(username, id)
if err != nil {
panic(err)
}
http.Redirect(w, r, "/list", http.StatusMovedPermanently)
}
}
// 刪除用戶
func deleteHandle(w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
http.Error(w, "請求方式錯誤", http.StatusMethodNotAllowed)
}
r.ParseForm()
id := r.Form["id"][0]
stmt, err := db.Prepare("DELETE FROM users WHERE id = ?")
if err != nil {
panic(err)
}
_,err = stmt.Exec(id)
if err != nil {
panic(err)
}
http.Redirect(w, r, "/list", http.StatusMovedPermanently)
}
4.models.go
package main
type User struct {
Id int64 `json:"id"`
Username string `json:"username"`
}
5.執行go run *.go運行或者go build來打包
6.在頁面輸入localhost:8888/ 進行操作