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


相关文章
|
1月前
|
数据库
ABAP 泛型编程实战 - 分享一个数据库表内容的拷贝工具试读版
ABAP 泛型编程实战 - 分享一个数据库表内容的拷贝工具试读版
20 0
|
1月前
|
运维 监控 Go
Go语言微服务实战与最佳实践
【2月更文挑战第14天】本文将深入探讨使用Go语言进行微服务实战中的最佳实践,包括服务拆分、API设计、并发处理、错误处理、服务治理与监控等方面。通过实际案例和详细步骤,我们将分享如何在Go语言环境中构建高效、稳定、可扩展的微服务系统。
|
28天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(8.0版本升级篇)
96 0
|
1天前
|
SQL 关系型数据库 MySQL
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
Golang数据库编程详解 | 深入浅出Go语言原生数据库编程
|
7天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
27 6
|
11天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
23天前
|
存储 安全 编译器
掌握Go语言:精通Go语言范围(range),高级应用及进销存系统实战(25)
掌握Go语言:精通Go语言范围(range),高级应用及进销存系统实战(25)
|
28天前
|
SQL 关系型数据库 MySQL
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)(一)
【MySQL技术专题】「问题实战系列」深入探索和分析MySQL数据库的数据备份和恢复实战开发指南(数据恢复补充篇)
30 0
|
1月前
|
设计模式 缓存 安全
一篇文章带你吃透Go语言的Atomic和Channel--实战方法
一篇文章带你吃透Go语言的Atomic和Channel--实战方法
29 0
|
1月前
|
SQL 机器学习/深度学习 缓存
Go语言Web应用实战与案例分析
【2月更文挑战第21天】本文将通过实战案例的方式,深入探讨Go语言在Web应用开发中的应用。我们将分析一个实际项目的开发过程,展示Go语言在构建高性能、可扩展Web应用方面的优势,并分享在开发过程中遇到的问题和解决方案,为读者提供宝贵的实战经验。