【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的时候进行级联更新或是级联删除。


相关文章
|
22天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
68 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
12天前
|
存储 SQL 数据库
深入浅出后端开发之数据库优化实战
【10月更文挑战第35天】在软件开发的世界里,数据库性能直接关系到应用的响应速度和用户体验。本文将带你了解如何通过合理的索引设计、查询优化以及恰当的数据存储策略来提升数据库性能。我们将一起探索这些技巧背后的原理,并通过实际案例感受优化带来的显著效果。
30 4
|
13天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
29 4
|
14天前
|
SQL 关系型数据库 MySQL
go语言中安装数据库驱动
【11月更文挑战第1天】
36 5
|
15天前
|
SQL 关系型数据库 MySQL
go语言中数据库操作
【10月更文挑战第22天】
28 4
|
14天前
|
关系型数据库 MySQL 数据库连接
go语言中打开数据库连接
【11月更文挑战第1天】
28 2
|
1月前
|
SQL NoSQL 数据库
Cassandra数据库与Cql实战笔记
Cassandra数据库与Cql实战笔记
18 1
Cassandra数据库与Cql实战笔记
|
20天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
96 1
|
1月前
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
59 11
|
21天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第26天】数据库作为现代应用系统的核心组件,其性能优化至关重要。本文主要探讨MySQL的索引策略与查询性能调优。通过合理创建索引(如B-Tree、复合索引)和优化查询语句(如使用EXPLAIN、优化分页查询),可以显著提升数据库的响应速度和稳定性。实践中还需定期审查慢查询日志,持续优化性能。
49 0
下一篇
无影云桌面