014-Go Web 对pg增删改查测试

1:data/data.go

package data

import(
    "fmt"
    "database/sql"
    _"github.com/lib/pq"
)

const(
    host = "192.168.72.128"
    port = 5432
    user = "test"
    password = "test"
    dbname = "testdb"
)

var Db *sql.DB

func init(){
    var err error

    pgInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable", 
        host, port, user, password, dbname)
    
    Db, err = sql.Open("postgres", pgInfo)

    if err != nil{
        panic(err)
    }
}

2:post/post.go

package post

import(
    ."Chapter10/data"
)

type Post struct{
    ID        int     `json:"id"`
    Content    string     `json:"content"`
    Author    string    `json:"author"`
}

func (post *Post) AddPost()(err error){
    sql := "insert into post(content,author) values($1,$2) returning id"
    stmt, err := Db.Prepare(sql)
    if err != nil{
        return
    }
    defer stmt.Close()
    err = stmt.QueryRow(post.Content, post.Author).Scan(&post.ID)
    return
}

func (post *Post) DelPost()(err error){
    sql := "delete from post where 
    _,err = Db.Exec(sql, post.ID)
    return
}

func (post *Post) EditPost()(err error){
    sql := "update post set content=$1 where 
    _,err = Db.Exec(sql, post.Content, post.ID)
    return
}

func FindPost(id int)(err error, post Post){
    sql := "select id, content, author from post where 
    post = Post{}
    err = Db.QueryRow(sql, id).Scan(&post.ID, &post.Content, &post.Author)
    return
}

3:main.go

package main

import(
    "encoding/json"
    "net/http"
    "path"
    "strconv"
    "time"
    ."Chapter10/post"
)

type Result struct{
    No    int             `json:"no"`
    Msg    string         `json:"msg"`
    Obj interface{} `json:"obj,omitempty"`
    Time time.Time  `json:"response_time"`
}

func main(){
    server := http.Server{
        Addr: "127.0.0.1:8080",
    }
    http.HandleFunc("/post/", handlerRequest)
    server.ListenAndServe()
}

func handlerRequest(w http.ResponseWriter, r *http.Request){
    var err error
    switch r.Method{
    case "GET":
        err = handleGet(w, r)
    case "POST":
        err = handlePost(w, r)
    case "PUT":
        err = handlePut(w, r)
    }

    if err != nil{
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}



func handleGet(w http.ResponseWriter, r *http.Request)(err error){
    id, err := strconv.Atoi(path.Base(r.URL.Path))
    if err != nil{
        return
    }
    err,post := FindPost(id)
    if err != nil{
        return
    }

    var result = Result{
        No:100,
        Msg:"获取POST信息",
        Obj:post,
        Time:time.Now(),
    }

    output, err := json.Marshal(&result)
    if err != nil{
        return
    }
    w.Header().Set("Content-Type", "application/json")
    w.Write(output)
    return
}

func handlePost(w http.ResponseWriter, r *http.Request)(err error){
    len := r.ContentLength
    body := make([]byte, len)
    r.Body.Read(body)

    var post Post
    json.Unmarshal(body, &post)

    err = post.AddPost()
    if err != nil{
        return
    }

    var result = Result{
        No:100,
        Msg:"保存POST信息",
        Time:time.Now(),
    }
    output, err := json.Marshal(&result)
    if err != nil{
        return
    }
    w.Header().Set("Content-Type", "application/json")
    w.Write(output)
    return
}    

func handlePut(w http.ResponseWriter, r *http.Request)(err error){
    len := r.ContentLength
    body := make([]byte, len)
    r.Body.Read(body)

    var post Post
    json.Unmarshal(body, &post)

    err = post.EditPost()
    if err != nil{
        return
    }

    var result = Result{
        No:100,
        Msg:"修改POST信息",
        Time:time.Now(),
    }
    output, err := json.Marshal(&result)
    if err != nil{
        return
    }
    w.Header().Set("Content-Type", "application/json")
    w.Write(output)
    return
}