Удаление данных

Последнее обновление: 03.03.2018

Продолжим работу с проектом из прошлой темы и добавим в него удаление объектов. Удаление можно сделать различными способами. В данном же случае мы оставимся на самом простом варианте, когда в GET-запросе передается id объекта, и в базе данных происходит удаление по этому id.

Итак, изменим код сервера следующим образом:

package main
import (
    "fmt"
	"database/sql"
    _ "github.com/go-sql-driver/mysql"
	"net/http"
	"html/template"
	"log"
	"github.com/gorilla/mux"
)
type Product struct{
    Id int
    Model string
    Company string
    Price int
}
var database *sql.DB

func DeleteHandler(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
    id := vars["id"]

	_, err := database.Exec("delete from productdb.Products where id = ?", id)
    if err != nil{
		log.Println(err)
	}
	
	http.Redirect(w, r, "/", 301)
}

func EditPage(w http.ResponseWriter, r *http.Request) {
	vars := mux.Vars(r)
    id := vars["id"]

	row := database.QueryRow("select * from productdb.Products where id = ?", id)
	prod := Product{}
	err := row.Scan(&prod.Id, &prod.Model, &prod.Company, &prod.Price)
    if err != nil{
		log.Println(err)
		http.Error(w, http.StatusText(404), http.StatusNotFound)
	}else{
		tmpl, _ := template.ParseFiles("templates/edit.html")
		tmpl.Execute(w, prod)
	}
}

func EditHandler(w http.ResponseWriter, r *http.Request) {
	err := r.ParseForm()
	if err != nil {
		log.Println(err)
	}
	id := r.FormValue("id")
	model := r.FormValue("model")
	company := r.FormValue("company")
	price := r.FormValue("price")

	_, err = database.Exec("update productdb.Products set model=?, company=?, price = ? where id = ?", 
		model, company, price, id)

	if err != nil {
		log.Println(err)
	}
	http.Redirect(w, r, "/", 301)
}

func CreateHandler(w http.ResponseWriter, r *http.Request) {
	if r.Method == "POST" {

		err := r.ParseForm()
		if err != nil {
			log.Println(err)
		}
  		model := r.FormValue("model")
  		company := r.FormValue("company")
  		price := r.FormValue("price")

  		_, err = database.Exec("insert into productdb.Products (model, company, price) values (?, ?, ?)", 
		  model, company, price)

  		if err != nil {
    		log.Println(err)
		}
		http.Redirect(w, r, "/", 301)
	}else{
		http.ServeFile(w,r, "templates/create.html")
	}
}

func IndexHandler(w http.ResponseWriter, r *http.Request) {

	rows, err := database.Query("select * from productdb.Products")
	if err != nil {
		log.Println(err)
	}
	defer rows.Close()
	products := []Product{}
	
	for rows.Next(){
		p := Product{}
		err := rows.Scan(&p.Id, &p.Model, &p.Company, &p.Price)
		if err != nil{
			fmt.Println(err)
			continue
		}
		products = append(products, p)
	}

	tmpl, _ := template.ParseFiles("templates/index.html")
	tmpl.Execute(w, products)
}

func main() {
	 
	db, err := sql.Open("mysql", "root:password@/productdb")
    
    if err != nil {
        log.Println(err)
	}
	database = db
	defer db.Close()
	
	router := mux.NewRouter()
	router.HandleFunc("/", IndexHandler)
  	router.HandleFunc("/create", CreateHandler)
    router.HandleFunc("/edit/{id:[0-9]+}", EditPage).Methods("GET")
	router.HandleFunc("/edit/{id:[0-9]+}", EditHandler).Methods("POST")
    router.HandleFunc("/delete/{id:[0-9]+}", DeleteHandler)
	
    http.Handle("/",router)

	fmt.Println("Server is listening...")
	http.ListenAndServe(":8181", nil)
}

По сравнению с прошлой темой зедсь добавлена функция DeleteHandler, которая получает id удаляемого объекта и выполняет DELETE-запрос к базе данных. И после удаления происходит переадресация на главную страницу.

Для упрощения удаления определим в файле index.html ссылку на удаление рядом с каждым объектом:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Products</title>
    </head>
    <body>
        <h2>Список товаров</h2>
        <p><a href="/create">Добавить</a></p>
        <table>
            <thead><th>Id</th><th>Model</th><th>Company</th><th>Price</th><th></th></thead>
            {{range . }}
            <tr>
                <td>{{.Id}}</td>
                <td>{{.Model}}</td>
                <td>{{.Company}}</td>
                <td>{{.Price}}</td>
                <td><a href="/edit/{{.Id}}">Изменить</a> |
                    <a href="/delete/{{.Id}}">Удалить</a>
                </td>
            </tr>
            {{end}}
        </table>
    </body>
</html>

Протестируем удаление, нажав на соответствующую ссылку рядом с каким-нибудь объектом:

Удаление из базы данных в Go
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850