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


相关文章
|
2月前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
313 7
|
3月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
|
人工智能 关系型数据库 OLAP
聚光灯已就位!阿里云瑶池数据库邀你征战Cursor首届实战征文大赛
阿里云AnalyticDB携手Cursor中文社区,正式发起首届实战征文大赛!我们诚邀开发者融合Cursor的智能编程能力与AnalyticDB PostgreSQL提供的Supabase服务进行项目开发,让优秀项目被专家看见、被机遇拥抱!
|
4月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
335 0
|
3月前
|
存储 前端开发 JavaScript
Go语言实战案例-项目实战篇:编写一个轻量级在线聊天室
本文介绍如何用Go语言从零实现一个轻量级在线聊天室,基于WebSocket实现实时通信,支持多人消息广播。涵盖前后端开发、技术选型与功能扩展,助你掌握Go高并发与实时通信核心技术。
|
4月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
490 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
3月前
|
存储 数据库 开发者
Python SQLite模块:轻量级数据库的实战指南
本文深入讲解Python内置sqlite3模块的实战应用,涵盖数据库连接、CRUD操作、事务管理、性能优化及高级特性,结合完整案例,助你快速掌握SQLite在小型项目中的高效使用,是Python开发者必备的轻量级数据库指南。
287 0
|
4月前
|
安全 Go 开发者
Go语言实战案例:使用sync.Mutex实现资源加锁
在Go语言并发编程中,数据共享可能导致竞态条件,使用 `sync.Mutex` 可以有效避免这一问题。本文详细介绍了互斥锁的基本概念、加锁原理及实战应用,通过构建并发安全的计数器演示了加锁与未加锁的区别,并封装了一个线程安全的计数器结构。同时对比了Go中常见的同步机制,帮助开发者理解何时应使用 `Mutex` 及其注意事项。掌握 `Mutex` 是实现高效、安全并发编程的重要基础。
|
4月前
|
数据采集 Go API
Go语言实战案例:使用context控制协程取消
本文详解 Go 语言中 `context` 包的使用,通过实际案例演示如何利用 `context` 控制协程的生命周期,实现任务取消、超时控制及优雅退出,提升并发程序的稳定性与资源管理能力。
|
4月前
|
数据采集 Go API
Go语言实战案例:多协程并发下载网页内容
本文是《Go语言100个实战案例 · 网络与并发篇》第6篇,讲解如何使用 Goroutine 和 Channel 实现多协程并发抓取网页内容,提升网络请求效率。通过实战掌握高并发编程技巧,构建爬虫、内容聚合器等工具,涵盖 WaitGroup、超时控制、错误处理等核心知识点。

热门文章

最新文章