Gorm的简单运用

Go 与数据库

后端简单一点就是增删改查,而大量的数据存在那儿呢?记事本?Excel表格?如果有成千上万的数据,存储和查询,还有并发问题就成了要考虑的了,因此数据库是一个很好的选择。

搭建一个mysql数据库,学习数据库的三范式,然后设计一个电子商务的数据库吧

要求:

  • 用户表,包含用户id,用户名,用户密码的hash
  • 商品表,包含商品id,商品名,价格
  • 店铺表,包含店铺id,店铺名,地址
  • 一个店铺有多种商品,一种商品可以放在不同店铺,商品和店铺之间是库存的关系
  • 一个用户可以对多个店铺的不同商品加入购物车

设计好你的数据库表吧,看看是否满足三范式。
查询用户购物车的商品以及每件商品所属的店铺,返回一个json

 ```json
 {
 	"user_id": 114514,
 	"cart": [{
 		"item_id": 1919,
 		"price": 8.10,
 		"belongTo": 114
 	}, {
 		"item_id": 1918,
 		"price": 8.11,
 		"belongTo": 114
 	}, {
 		"item_id": 1929,
 		"price": 8.60,
 		"belongTo": 112
 	}]
 }
 ```

代码

// query
package main


import (
	"encoding/json"


	"io/ioutil"
	"log"
	"net/http"


	"github.com/jinzhu/gorm"


	_ "github.com/go-sql-driver/mysql"
)


type User struct {
	Id       int32  `gorm:"column:id"`
	Name     string `gorm:"column:name"`
	Password string `gorm:"column:password"`
}


type Store struct {
	Id      int32  `gorm:"column:id"`
	Name    string `gorm:"column:name"`
	Address string `gorm:"column:address"`
}


type Item struct {
	Id    int32   `gorm:"column:id"`
	Name  string  `gorm:"column:name"`
	Price float64 `gorm:"column:price"`
}


type Cart struct {
	Itemid  int32   `json:"item_id, omitempty";gorm:"column:storeid"`
	Price   float64 `json:"price, omitempty";gorm:"-"`
	Storeid int32   `json:"belongTo, omitempty";gorm:"column:storeid"`
}


type Response struct {
	Userid int32  `json:"user_id"`
	Items  []Cart `json:"cart, omitempty"`
}


type Request struct {
	Name string `json:"username"`
	Id   int32  `json:"user_id"`
}


func get_id(data Request) Request {
	db := Connect()
	var result User
	db.Table("user").Where("name=?", data.Name).Find(&result)
	data.Id = result.Id
	defer db.Close()
	return data
}


func get_price(id int32) float64 {
	db := Connect()
	var result Item
	db.Table("item").Where("id=?", id).Find(&result)
	db.Close()
	return result.Price
}


func mycart(myid int32) Response {
	db := Connect()
	var data Response
	data.Userid = myid
	db.Table("cart").Where("userid=?", myid).Find(&data.Items)
	db.Close()
	for i := 0; i < len(data.Items); i++ {
		data.Items[i].Price = get_price(data.Items[i].Itemid)
	}
	return data
}


func query(writer http.ResponseWriter, request *http.Request) {
	if request.Method != "POST" {
		return
	}
	defer request.Body.Close()
	con, _ := ioutil.ReadAll(request.Body)
	var data Request
	json.Unmarshal(con, &data)
	data = get_id(data)
	con, _ = json.Marshal(mycart(data.Id))
	writer.Write(con)
}


func Connect() *gorm.DB {
	var DNS string
	DNS = "root:root@tcp(localhost:3306)/shop?charset=utf8"
	db, err := gorm.Open("mysql", DNS)
	if err != nil {
		log.Fatal(err)
	}
	return db
}


func main() {
	http.HandleFunc("/Cart", query)
	err := http.ListenAndServe("localhost:8080", nil)
	if err != nil {
		log.Fatal(err)
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值