Добавление данных

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

Процесс добавления данных разбивается на две части. Вначале нам надо показать пользователю форму для ввода данных. Затем, когда пользователь отправит введенные данные, нам надо их получить и добавить в базу данных.

Возьмем проект из прошлой темы. И прежде всего добавим в папку templates новый файл create.html, который будет содержать форму для добавления:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>New Product</title>
    </head>
    <body>
        <h3>Add Product</h3>
        <form method="POST">
            <label>Model</label><br>
            <input type="text" name="model" /><br><br>
            <label>Company</label><br>
            <input type="text" name="company" /><br><br>
            <label>Price</label><br>
            <input type="number" name="price" /><br><br>
            <input type="submit" value="Send" />
        </form>
    </body>
</html>
Create in Database in Golang

Изменим файл сервера следующим образом:

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

// функция добавления данных
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()
	http.HandleFunc("/", IndexHandler)
	http.HandleFunc("/create", CreateHandler)

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

Для добавления данных определена функция CreateHandler(). Поскольку нам надо, с одной стороны, отображать пользователю форму для добавления, а, с другой стороны, получать и добавлять данные в БД, то данная функция условно разделена на две части. В ней мы проверяем тип запроса. Если запрос представляет тип "GET", то мы будем возвращать форму для добавления. Если запрос имеет тип "POST", то парсим данные полученной формы и извлекаем из них нужные элементы.

Для извлечения нужных данных из полученных форм применяется метод r.FormValue(). В качестве параметра этому методу передается название данных. То есть, например, на форме есть следующее поле:

<input type="text" name="model" />

Атрибут name указывает, что название этого поля - "model". Следовательно, чтобы получить введенные в него данные, необходимо использовать выражение model := r.FormValue("model").

После получения всех данных они добавляются в БД с помощью метода database.Exec:

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

После этого выполняется переадресация на корень сайта с помощью функции http.Redirect:

http.Redirect(w, r, "/", 301)

Третий параметр указывает путь переадресации. В данном случае "/", по которому выводится список объектов из БД. Четвертый параметр представляет статусный код переадресации. В данном случае код 301 указывает, что переадресация временная.

Если же запрос к серверу представляет тип GET, то просто возвращаем пользователю веб-страницу create.html:

http.ServeFile(w,r, "templates/create.html")

Функция IndexHandler, которая возвращает список объектов, остается той же, что и в прошлой теме.

Ну и в функции main CreateHandler устанавливаеncя в качестве обработчика по пути "/create":

http.HandleFunc("/create", CreateHandler)

Запустим приложение. Перейдем по пути "http://localhost:8181/create", и нам отобразится форма. Введем в нее какие-нибудь данные:

Добавление данных в бд в GO

И после отправки формы приложение получит данные, добавит их в БД и переадресует на главную страницу:

Переадресация redirect в GO
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850