【Go实战 | 电商平台】(3) 数据库建表

简介: 文章目录写在前面1. 初始化连接2. 建立表3. 迁移写在前面

文章目录

写在前面

1. 初始化连接

2. 建立表

3. 迁移

写在前面

第一节,我们确定了ER图,数据字典。

第二节,我们已经配置了MySQL。

结合前两章,我们就可以建立数据库表了。

image.png

1. 初始化连接

init.go
package model
import (
  "github.com/gin-gonic/gin"
  "github.com/jinzhu/gorm"
  _ "github.com/jinzhu/gorm/dialects/mysql"
  "time"
)
var DB *gorm.DB
func Database(connString string) {
  db, err := gorm.Open("mysql", connString)
  db.LogMode(true) //GORM的打印
  if err != nil {
  panic(err)
  }
  if gin.Mode() == "release" {
  db.LogMode(false)
  }
  db.SingularTable(true)      //默认不加复数s
  db.DB().SetMaxIdleConns(20)   //设置连接池,空闲
  db.DB().SetMaxOpenConns(100)  //打开
  db.DB().SetConnMaxLifetime(time.Second * 30)
  DB = db
  migration()
}


2. 建立表

user

用户表

type User struct {
  gorm.Model
  UserName       string `gorm:"unique"`
  Email          string  //`gorm:"unique"`
  PasswordDigest string
  Nickname       string `gorm:"not null"`
  Status         string
  Avatar         string `gorm:"size:1000"`
  Money          int
}


product 商品表

type Product struct {
  gorm.Model
  Name          string `gorm:"size:255;index"`
  Category Category `gorm:"ForeignKey:CategoryID"`
  CategoryID    uint `gorm:"not null"`
  Title         string
  Info          string `gorm:"size:1000"`
  ImgPath       string
  Price         string
  DiscountPrice string
  OnSale     bool `gorm:"default:false"`
  Num     int
  BossID        int
  BossName      string
  BossAvatar    string
}


ProductImg 商品图片表

type ProductImg struct {
  gorm.Model
  Product Product `gorm:"ForeignKey:ProductID"`
  ProductID  uint `gorm:"not null"`
  ImgPath    string
}

ProductParamImg 商品参数表

type ProductParamImg struct {
  gorm.Model
  Product Product `gorm:"ForeignKey:ProductID"`
  ProductID  uint `gorm:"not null"`
  ImgPath   string
}


ProductInfoImg 商品详情表

type ProductInfoImg struct {
  gorm.Model
  Product Product `gorm:"ForeignKey:ProductID"`
  ProductID  uint `gorm:"not null"`
  ImgPath   string
}

购物车表

type Cart struct {
  gorm.Model
  UserID    uint
  Product Product `gorm:"ForeignKey:ProductID"`
  ProductID uint `gorm:"not null"`
  BossID    uint
  Num       uint
  MaxNum    uint
  Check     bool
}

Order 订单表

type Order struct {
  gorm.Model
  User    User    `gorm:"ForeignKey:UserID"`
  UserID       uint   `gorm:"not null"`
  Product      Product  `gorm:"ForeignKey:ProductID"`
  ProductID    uint   `gorm:"not null"`
  Boss   User   `gorm:"ForeignKey:BossID"`
  BossID   uint   `gorm:"not null"`
  Address   Address  `gorm:"ForeignKey:AddressID"`
  AddressID    uint   `gorm:"not null"`
  Num          uint
  OrderNum     uint64
  Type         uint
  Money    int
}


地址表

type Address struct {
  gorm.Model
  User  User `gorm:"ForeignKey:UserID"`
  UserID  uint `gorm:"not null"`
  Name    string `gorm:"type:varchar(20) not null"`
  Phone   string `gorm:"type:varchar(11) not null"`
  Address string `gorm:"type:varchar(50) not null"`
}


收藏表

type Favorite struct {
  gorm.Model
  User    User    `gorm:"ForeignKey:UserID"`
  UserID       uint   `gorm:"not null"`
  Product      Product  `gorm:"ForeignKey:ProductID"`
  ProductID    uint   `gorm:"not null"`
  Boss   User   `gorm:"ForeignKey:BossID"`
  BossID   uint   `gorm:"not null"`
}

分类表

type Category struct {
  gorm.Model
  CategoryName string
}

管理员表

type Admin struct {
  gorm.Model
  UserName       string
  PasswordDigest string
  Avatar         string `gorm:"size:1000"`
}


轮播图表

type Carousel struct {
  gorm.Model
  ImgPath   string
  Product Product `gorm:"ForeignKey:ProductID"`
  ProductID uint `gorm:"not null"`
}

3. 迁移

做迁移并加上外键约束

func migration() {
  //自动迁移模式
  DB.Set("gorm:table_options", "charset=utf8mb4").
  AutoMigrate(&User{}).
  AutoMigrate(&Product{}).
  AutoMigrate(&Carousel{}).
  AutoMigrate(&Category{}).
  AutoMigrate(&Favorite{}).
  AutoMigrate(&ProductImg{}).
  AutoMigrate(&ProductInfoImg{}).
  AutoMigrate(&ProductParamImg{}).
  AutoMigrate(&Order{}).
  AutoMigrate(&Cart{}).
  AutoMigrate(&Admin{}).
  AutoMigrate(&Address{})
  DB.Model(&Cart{}).AddForeignKey("product_id","Product(id)","CASCADE","CASCADE")
  DB.Model(&Order{}).AddForeignKey("user_id","User(id)","CASCADE","CASCADE")
  DB.Model(&Order{}).AddForeignKey("address_id","Address(id)","CASCADE","CASCADE")
  DB.Model(&Order{}).AddForeignKey("product_id","Product(id)","CASCADE","CASCADE")
  DB.Model(&Order{}).AddForeignKey("boss_id","User(id)","CASCADE","CASCADE")
  DB.Model(&Favorite{}).AddForeignKey("boss_id","User(id)","CASCADE","CASCADE")
  DB.Model(&Favorite{}).AddForeignKey("user_id","User(id)","CASCADE","CASCADE")
  DB.Model(&Favorite{}).AddForeignKey("product_id","Product(id)","CASCADE","CASCADE")
  DB.Model(&Product{}).AddForeignKey("category_id","Category(id)","CASCADE","CASCADE")
  DB.Model(&ProductImg{}).AddForeignKey("product_id","Product(id)","CASCADE","CASCADE")
  DB.Model(&ProductInfoImg{}).AddForeignKey("product_id","Product(id)","CASCADE","CASCADE")
  DB.Model(&ProductParamImg{}).AddForeignKey("product_id","Product(id)","CASCADE","CASCADE")
  DB.Model(&Address{}).AddForeignKey("user_id","User(id)","CASCADE","CASCADE")
}

AutoMigrate函数是把代码映射到数据库中

AddForeignKey函数是添加外键

举例子

DB.Model(&Cart{}).AddForeignKey("product_id","Product(id)","CASCADE","CASCADE")

这个函数就是在Cart表中把product_id字段关联到product的id中,后面两个就是update和delete的时候进行级联更新或是级联删除。


相关文章
|
15天前
|
安全 大数据 Go
深入探索Go语言并发编程:Goroutines与Channels的实战应用
在当今高性能、高并发的应用需求下,Go语言以其独特的并发模型——Goroutines和Channels,成为了众多开发者眼中的璀璨明星。本文不仅阐述了Goroutines作为轻量级线程的优势,还深入剖析了Channels作为Goroutines间通信的桥梁,如何优雅地解决并发编程中的复杂问题。通过实战案例,我们将展示如何利用这些特性构建高效、可扩展的并发系统,同时探讨并发编程中常见的陷阱与最佳实践,为读者打开Go语言并发编程的广阔视野。
|
1天前
|
Shell Go API
Go语言grequests库并发请求的实战案例
Go语言grequests库并发请求的实战案例
|
24天前
|
SQL 关系型数据库 MySQL
干货!python与MySQL数据库的交互实战
干货!python与MySQL数据库的交互实战
|
25天前
|
消息中间件 缓存 Kafka
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
|
25天前
|
缓存 NoSQL Redis
go-zero微服务实战系列(七、请求量这么高该如何优化)
go-zero微服务实战系列(七、请求量这么高该如何优化)
|
25天前
|
缓存 NoSQL 数据库
go-zero微服务实战系列(五、缓存代码怎么写)
go-zero微服务实战系列(五、缓存代码怎么写)
|
17天前
|
SQL 安全 数据库
基于SQL Server事务日志的数据库恢复技术及实战代码详解
基于事务日志的数据库恢复技术是SQL Server中一个非常强大的功能,它能够帮助数据库管理员在数据丢失或损坏的情况下,有效地恢复数据。通过定期备份数据库和事务日志,并在需要时按照正确的步骤恢复,可以最大限度地减少数据丢失的风险。需要注意的是,恢复数据是一个需要谨慎操作的过程,建议在执行恢复操作之前,详细了解相关的操作步骤和注意事项,以确保数据的安全和完整。
36 0
|
24天前
|
消息中间件 SQL 关系型数据库
go-zero微服务实战系列(十、分布式事务如何实现)
go-zero微服务实战系列(十、分布式事务如何实现)
|
24天前
|
消息中间件 NoSQL Kafka
go-zero微服务实战系列(九、极致优化秒杀性能)
go-zero微服务实战系列(九、极致优化秒杀性能)
|
25天前
|
消息中间件 缓存 监控
go-zero微服务实战系列(六、缓存一致性保证)
go-zero微服务实战系列(六、缓存一致性保证)