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)
}
}