zoukankan      html  css  js  c++  java
  • go+mysql实现页面的增删改查练习

    原文地址: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/  进行操作

  • 相关阅读:
    How to convert VirtualBox vdi to KVM qcow2
    (OK)(OK) adb -s emulator-5554 shell
    (OK)(OK) using adb with a NAT'ed VM
    (OK) How to access a NAT guest from host with VirtualBox
    (OK) Creating manually one VMs from an existing VDI file in CLI (VBoxManage) in Fedora 23
    (OK)(OK) Creating VMs from an existing VDI file in CLI (VBoxManage) in Fedora 23
    (OK) Creating_VMs_from_an_existing_VDI_file.txt
    (OK) Creating VMs from an existing VDI file —— in OS X
    (OK) install_IBM_SERVER.txt
    (OK) install chrome & busybox in android-x86_64 —— uninstall chrome
  • 原文地址:https://www.cnblogs.com/zhouqi666/p/9635612.html
Copyright © 2011-2022 走看看