Belongs To
用户属于公司,删除表时候先删除用户表再删除公司表
基本使用
package main
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/go_orm?charset=utf8mb4&parseTime=True&loc=Local"
// d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
db = d
}
type Company struct {
ID int
Name string
}
// User 属于 Company CompanyID 是外键
type User struct {
gorm.Model
Name string
CompanyID int
Company Company
}
func createTable() {
// 数据库配置文件设置创建的表为InnoDB
// default-storage-engine=INNODB
db.AutoMigrate(&Company{}, &User{})
}
func main() {
createTable()
}
运行之后创建的表SQL如下
CREATE TABLE `companies` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
`name` longtext,
`company_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_users_deleted_at` (`deleted_at`),
KEY `fk_users_company` (`company_id`),
CONSTRAINT `fk_users_company` FOREIGN KEY (`company_id`) REFERENCES `companies` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
重写外键
package main
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/go_orm?charset=utf8mb4&parseTime=True&loc=Local"
// d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
db = d
}
type User struct {
gorm.Model
Name string
CompanyRefer int
Company Company `gorm:"foreignKey:CompanyRefer"`
// 使用 CompanyRefer 作为外键
}
type Company struct {
ID int
Name string
}
func createTable() {
// 数据库配置文件设置创建的表为InnoDB
// default-storage-engine=INNODB
// db.AutoMigrate(&Company{}, &User{})
db.AutoMigrate(&User{}, &Company{})
// 先后顺序不影响创建
}
func main() {
createTable()
}
运行之后创建的表SQL如下
CREATE TABLE `companies` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
`name` longtext,
`company_refer` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_users_deleted_at` (`deleted_at`),
KEY `fk_users_company` (`company_refer`),
CONSTRAINT `fk_users_company` FOREIGN KEY (`company_refer`) REFERENCES `companies` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Has One
基本使用
package main
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/go_orm?charset=utf8mb4&parseTime=True&loc=Local"
// d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
db = d
}
// User 有一张 CreditCard,CreditCardID 是外键
type User struct {
gorm.Model
CreditCard CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
func createTable() {
// 数据库配置文件设置创建的表为InnoDB
// default-storage-engine=INNODB
db.AutoMigrate(&User{}, &CreditCard{})
}
func main() {
createTable()
}
运行之后创建的表SQL如下
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_users_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `credit_cards` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
`number` longtext,
`user_id` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_credit_cards_deleted_at` (`deleted_at`),
KEY `fk_users_credit_card` (`user_id`),
CONSTRAINT `fk_users_credit_card` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
重写外键
package main
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/go_orm?charset=utf8mb4&parseTime=True&loc=Local"
// d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
db = d
}
type User struct {
gorm.Model
CreditCard CreditCard `gorm:"foreignKey:UserName"`
// 使用 UserName 作为外键
}
type CreditCard struct {
gorm.Model
Number string
UserName string
}
func createTable() {
// 数据库配置文件设置创建的表为InnoDB
// default-storage-engine=INNODB
db.AutoMigrate(&User{}, &CreditCard{})
}
func main() {
createTable()
}
运行之后创建的表SQL如下
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_users_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `credit_cards` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
`number` longtext,
`user_name` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_credit_cards_deleted_at` (`deleted_at`),
KEY `fk_users_credit_card` (`user_name`),
CONSTRAINT `fk_users_credit_card` FOREIGN KEY (`user_name`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Has Many
基本使用
package main
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/go_orm?charset=utf8mb4&parseTime=True&loc=Local"
// d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
db = d
}
// User 有多张 CreditCard,UserID 是外键
type User struct {
gorm.Model
CreditCards []CreditCard
}
type CreditCard struct {
gorm.Model
Number string
UserID uint
}
func createTable() {
// 数据库配置文件设置创建的表为InnoDB
// default-storage-engine=INNODB
db.AutoMigrate(&User{}, &CreditCard{})
}
func main() {
createTable()
}
运行之后创建的表SQL如下
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_users_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `credit_cards` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
`number` longtext,
`user_id` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_credit_cards_deleted_at` (`deleted_at`),
KEY `fk_users_credit_cards` (`user_id`),
CONSTRAINT `fk_users_credit_cards` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
重写外键
package main
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/go_orm?charset=utf8mb4&parseTime=True&loc=Local"
// d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
db = d
}
type User struct {
gorm.Model
CreditCards []CreditCard `gorm:"foreignKey:UserRefer"`
}
type CreditCard struct {
gorm.Model
Number string
UserRefer uint
}
func createTable() {
// 数据库配置文件设置创建的表为InnoDB
// default-storage-engine=INNODB
db.AutoMigrate(&User{}, &CreditCard{})
}
func main() {
createTable()
}
运行之后创建的表SQL如下
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_users_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `credit_cards` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
`number` longtext,
`user_refer` bigint(20) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_credit_cards_deleted_at` (`deleted_at`),
KEY `fk_users_credit_cards` (`user_refer`),
CONSTRAINT `fk_users_credit_cards` FOREIGN KEY (`user_refer`) REFERENCES `users` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
多态关联
GORM 为 has one 和 has many 提供了多态关联支持,它会将拥有者实体的表名、主键都保存到多态类型的字段中
package main
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/go_orm?charset=utf8mb4&parseTime=True&loc=Local"
// d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
db = d
}
type Dog struct {
ID int
Name string
Toys []Toy `gorm:"polymorphic:Owner;"`
}
type Cat struct {
ID int
Name string
Toys []Toy `gorm:"polymorphic:Owner;"`
}
type Toy struct {
ID int
Name string
OwnerID int
OwnerType string
}
func createTable() {
// 数据库配置文件设置创建的表为InnoDB
// default-storage-engine=INNODB
db.AutoMigrate(&Dog{}, &Cat{}, &Toy{})
}
func main() {
createTable()
// 插入数据
db.Create(&Dog{Name: "dog1", Toys: []Toy{{Name: "toy1"}, {Name: "toy2"}}})
db.Create(&Cat{Name: "cat1", Toys: []Toy{{Name: "toy1"}, {Name: "toy2"}}})
}
运行之后创建的表SQL如下
CREATE TABLE `cats` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
INSERT INTO `cats` VALUES (1,'cat1');
CREATE TABLE `dogs` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
INSERT INTO `dogs` VALUES (1,'dog1');
CREATE TABLE `toys` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` longtext,
`owner_id` bigint(20) DEFAULT NULL,
`owner_type` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
INSERT INTO `toys` VALUES (1,'toy1',1,'dogs'),(2,'toy2',1,'dogs'),(3,'toy1',1,'cats'),(4,'toy2',1,'cats');
使用标签 polymorphicValue 来更改多态类型的值
package main
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/go_orm?charset=utf8mb4&parseTime=True&loc=Local"
// d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
db = d
}
type Dog struct {
ID int
Name string
Toys []Toy `gorm:"polymorphic:Owner;polymorphicValue:master-dog"`
}
type Cat struct {
ID int
Name string
Toys []Toy `gorm:"polymorphic:Owner;polymorphicValue:master-cat"`
}
type Toy struct {
ID int
Name string
OwnerID int
OwnerType string
}
func createTable() {
// 数据库配置文件设置创建的表为InnoDB
// default-storage-engine=INNODB
db.AutoMigrate(&Dog{}, &Cat{}, &Toy{})
}
func main() {
createTable()
// 插入数据
db.Create(&Dog{Name: "dog1", Toys: []Toy{{Name: "toy1"}, {Name: "toy2"}}})
db.Create(&Cat{Name: "cat1", Toys: []Toy{{Name: "toy1"}, {Name: "toy2"}}})
}
运行之后创建的表SQL如下
CREATE TABLE `cats` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
INSERT INTO `cats` VALUES (1,'cat1');
CREATE TABLE `dogs` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;
INSERT INTO `dogs` VALUES (1,'dog1');
CREATE TABLE `toys` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` longtext,
`owner_id` bigint(20) DEFAULT NULL,
`owner_type` longtext,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
INSERT INTO `toys` VALUES (1,'toy1',1,'master-dog'),(2,'toy2',1,'master-dog'),(3,'toy1',1,'master-cat'),(4,'toy2',1,'master-cat');
Many To Many
基本使用
package main
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
var db *gorm.DB
func init() {
dsn := "root:root@tcp(127.0.0.1:3306)/go_orm?charset=utf8mb4&parseTime=True&loc=Local"
// d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{Logger: logger.Default.LogMode(logger.Info)})
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
db = d
}
// User 拥有并属于多种 language,`user_languages` 是连接表
type User struct {
gorm.Model
Languages []Language `gorm:"many2many:user_languages;"`
}
type Language struct {
gorm.Model
Name string
}
func createTable() {
// 数据库配置文件设置创建的表为InnoDB
// default-storage-engine=INNODB
db.AutoMigrate(&User{}, &Language{})
}
func main() {
createTable()
}
运行之后创建的表SQL如下
CREATE TABLE `users` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_users_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `languages` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`created_at` datetime DEFAULT NULL,
`updated_at` datetime DEFAULT NULL,
`deleted_at` datetime DEFAULT NULL,
`name` longtext,
PRIMARY KEY (`id`),
KEY `idx_languages_deleted_at` (`deleted_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
CREATE TABLE `user_languages` (
`user_id` bigint(20) unsigned NOT NULL DEFAULT '0',
`language_id` bigint(20) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`user_id`,`language_id`),
KEY `fk_user_languages_language` (`language_id`),
CONSTRAINT `fk_user_languages_user` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`),
CONSTRAINT `fk_user_languages_language` FOREIGN KEY (`language_id`) REFERENCES `languages` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;