go get -u gorm.io/gorm
mysql如果你使用mysql
go get -u gorm.io/driver/mysql
数据库实 ***
初始化数据库
package test_gorm
import (
"gorm.io/gorm"
_ "gorm.io/gorm/dialects/sqlite"
)
var db *gorm.DB
func init() {
var err error
db, err = gorm.Open("sqlite3", "test.db") // 连接数据库sqlite3
db = db.Debug() // 设置数据库模式,这样方便输出日志以及sql原句
if err != nil {
panic(err)
}
sqlDB := db.DB()
sqlDB.SetMaxOpenConns(100) // 设置连接池最大连接数
sqlDB.SetMaxIdleConns(20) // 设置空闲连接数
}
// 全局获取,给其他模块适用
func GetDB() *gorm.DB {
return db
}
建立数据库模型
package test_gorm
import "gorm.io/gorm"
/*
CREATE TABLE `food` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增ID,商品Id',
`name` varchar(30) NOT NULL COMMENT '商品名',
`price` decimal(10,2) unsigned NOT NULL COMMENT '商品价格',
`type_id` int(10) unsigned NOT NULL COMMENT '商品类型Id',
`createtime` int(10) NOT NULL DEFAULT 0 COMMENT '创建时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
*/
// 定义表数据库表结构
type Food struct {
gorm.Model // gorm内置了几个常用字段
Name string
Price float64
TypeId int
}
插入数据
package test_gorm
import (
"fmt"
)
func CreateFood() {
db.Create(&Food{
Price: 10.3,
Name: "ljc",
TypeId: 1,
})
fmt.Println("成功创建")
}
查询数据
package test_gorm
import (
"fmt"
)
func FirstFood() {
food := Food{}
db.First(&food) // 获取第一条数据
fmt.Println("FirstFood-->", food)
}
func TakeFood() {
food := Food{}
db.Take(&food) // 获取一条数据,此时数据库表为food
fmt.Println("TakeFood-->", food)
}
func ModelTake() {
food := Food{}
db.Model(Food{}).Take(&food) // 获取一条数据,此时数据库表由Mode指定
fmt.Println("ModelTake-->", food)
}
func LastFood() {
food := Food{}
db.Last(&food) // 获取最后一条数据
fmt.Println("LastFood-->", food)
}
func FindFood(limit int) {
var foods []Food
db.Limit(limit).Find(&foods) // 获取多条数据,列表
for index, food_ := range foods {
fmt.Println("FindFood-->", index, food_)
}
}
func Where() {
food := Food{}
db.Where("id == ?", 3).Take(&food) // 条件查询,sql
fmt.Println("Where-->", food)
food_ := Food{}
food_.ID = 5
db.Where(&food_).Take(&food_) // 条件查询,结构体
fmt.Println("Where-->", food_)
}
func Select() {
food := Food{}
db.Model(food).Where("id == ?", 3).Select("name").Take(&food) // 筛选字段
fmt.Println("Select-->", food)
}
func Count() {
var total int
db.Model(Food{}).Count(&total) // 计数
fmt.Println("Count-->", total)
}
更新数据
package test_gorm
import "fmt"
func WhereSave() {
food := Food{}
db.Model(food).Where("id == ?", 3).Take(&food)
food.Name = "ljc"
db.Save(&food) // 修改数据后直接save
fmt.Println("WhereSaveBefore-->", food)
food.Name = "jacklee"
db.Save(&food)
fmt.Println("WhereSaveAfter-->", food)
}
func WhereUpdates() {
updateFood := Food{
Name: "lijiacai",
Price: 1000000,
}
var food Food
sql := db.Model(Food{}).Where("id == ?", 5)
sql.Take(&food)
fmt.Println("WhereUpdatesBefore-->", food)
sql.Updates(&updateFood) // 多字段更新
sql.Take(&food)
fmt.Println("WhereUpdatesAfter-->", food)
}
删除数据
package test_gorm
import "fmt"
func Delete() {
food := Food{}
db.Model(Food{}).Take(&food)
db.Model(Food{}).Where(&food).Delete(&food) // 按条件删除
fmt.Println("Delete-->", food)
}
多表联查案例
package test_gorm
import "fmt"
type Topic struct {
gorm.Model
Title string
Content string
UserId int
User User `gorm:"foreignkey:UserId"` // 此时本表中的UserId关联User.Id
}
type User struct {
gorm.Model
Name string
}
func (obj User) TableName() string {
return "user"
}
func (obj Topic) TableName() string {
return "topic"
}
func CreateUser() {
user := User{}
user.Name = "lijiacai"
db.Save(&user) // 创建数据可以用save或者create
}
func CreateTopic() {
topic := Topic{}
topic.Title = "Alice dream"
topic.Content = "Yestoday,I will do ......."
topic.UserId = 1
db.Save(&topic)
}
func RalationSearch() {
topic := Topic{}
db.Model(Topic{}).Last(&topic)
fmt.Println("RalationSearch-->topic--", topic)
user := User{}
db.Model(&topic).Association("User").Find(&user) // 关联外键查询
fmt.Println("RalationSearch-->user--", user)
topic.User = user
fmt.Println("RalationSearch-->topic(user)--", topic)
}
type JoinRes struct {
Topic
User
}
func JoinSearch() {
var joinRes []JoinRes
err := db.Table("topic").Select("topic.*, user.*").Joins("left join user on topic.user_id=user.id").Find(&joinRes).Error // 多表联合查询,基本上都是sql写法
if err != nil {
fmt.Println(err)
}
fmt.Println("JoinSearch-->", joinRes[0].Title, joinRes[0].Name, joinRes[0].Content)
}
数据库事务
package test_gorm
import (
"errors"
"github.com/jinzhu/gorm"
)
func Transaction(tx *gorm.DB) error {
food := Food{}
food.Name = "zmj"
food.Price = 5
food.TypeId = 3
err := tx.Create(&food).Error
return err
}
func TransactionPanic(tx *gorm.DB) error {
food := Food{}
food.Name = "zmj"
food.Price = 88
food.TypeId = 88
err := tx.Create(&food).Error
err = errors.New("主动异常")
return err
}
执行
package main
import (
"casbin-go/test-gorm"
"fmt"
)
func TestFood() {
test_gorm.CreateFood()
test_gorm.FirstFood()
test_gorm.LastFood()
test_gorm.TakeFood()
test_gorm.FindFood(2)
test_gorm.Where()
test_gorm.ModelTake()
test_gorm.Select()
test_gorm.WhereSave()
test_gorm.WhereUpdates()
test_gorm.Delete()
test_gorm.Count()
test_gorm.GetDB().Transaction(test_gorm.Transaction)
test_gorm.LastFood()
err := test_gorm.GetDB().Transaction(test_gorm.TransactionPanic).Error()
fmt.Println(err)
test_gorm.LastFood()
}
func TestTopicUser() {
//test_gorm.CreateUser()
//test_gorm.CreateTopic()
test_gorm.RalationSearch()
test_gorm.JoinSearch()
}
func main() {
test_gorm.GetDB().AutoMigrate(&test_gorm.Food{}, &test_gorm.User{}, &test_gorm.Topic{}) // 自动创建表
//TestFood()
TestTopicUser()
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)