Skip to content
GwiyeomGo Tech Blog
About GwiyeomGo

Golang(Go) 에서 xorm 으로 crud 만들기

GOLANG, 20223 min read

CRUD

1. xorm 에서 CRUD 하기

type User struct {
Id int64 `xorm:"id pk autoincr" ` //pk
Name string
Age int64
Created time.Time `xorm:"created"` //Created tag will automatically inserted current time when you insert one record
Updated time.Time `xorm:"updated"`
DeletedAt time.Time `xorm:"deleted"` //Deleted will not really remove one record from table but only tag as deleted via current time.
}
type Detail struct {
Id int64
UserId int64 `xorm:"index"` // index는 column name
}
type UserDetail struct {
User `xorm:"extends"`
Detail `xorm:"extends"` //Detail struct
}

Create

  • var user User
  • engine.Insert(&user)// INSERT user (created...) VALUES (?...)

Find ,Get

Update

  • affected, err := engine.ID(1).Update(&user)// UPDATE user SET ... Where id = ?

  • AllCols , Cols

    1. Saved 상태,Registed 상태가 존재
    2. Saved 상태의 수정 프로세스
      1. 수정할 값만 body로 요청
      2. 값 bind 후 유효성 검사 => require 값을 피하기위해 상태가 Saved 일경우 Validate 안하도록 조건 추가
      3. 신청 id 로 내용을 조회 => db에 기록된 신청 상태가 Registered면 에러가 나도록 변경
      4. Saved 면 update 하도록 씀 => xorm update
    if cols == "*" {
    builder = builder.AllCols()
    } else if len(cols) > 0 {
    builder = builder.Cols(cols)
    }

Delete

  • engine.ID(1).Delete(&user)// UPDATE user SET ..., deleted_at = ? WHERE id = ?
  • engine.ID(1).Unscoped().Delete(&user)// Then this record will be really deleted

2. gorm 에서 CRUD 하기

type User struct {
ID int64 `gorm:"primary_key"` //pk
Name string `gorm:"not null"`
Age int64 `gorm:"default:18"` //default tag로 기본값 지정
Active bool
DeletedAt soft_delete.DeletedAt //delete flag로 초까지 ,gorm.DeletedAt 분까지
}

Create

user := User{Name: "test", Age: 18, }
result := db.Create(&user)
db.Select("Name", "Age", "CreatedAt").Create(&user)

db.Select("Name", "Age", "CreatedAt").Create(&user)// INSERT INTO users (name,age,created_at) VALUES ("jinzhu", 18, "2020-07-04 11:05:21.775")

UPDATE

user.Age = 100
db.Save(&user)// UPDATE users SET name='test', age=100, updated_at = '2013-11-17 21:34:10' WHERE id=111

user.Id =1 db.Model(&user).Where("active = ?", true).Update("name", "hello")// UPDATE users SET name='hello', updated_at='2013-11-17 21:34:10' WHERE id=1 AND active=true

Delete

db.Delete(&User{}, 1)// DELETE FROM users WHERE id = 1;//Delete with primary key GORM allows to delete objects using primary key

Delete Flag

UPDATE users SET deleted_at = /* current unix second */ WHERE ID = 1;

soft_delete는 뭐지?

Many To Many

//Member has and belong to many roles, `member_roles`는 join table 이다
type MemberEntity struct {
...
Roles []rbac.RoleEntity `gorm:"many2many:member_roles;"` //두 모델 사이에 조인 테이블을 추가
}

How to insert multiple data at once

배경 특정 구독자에게 한번에 메세지를 보내고 보낸 기록을 남기기위해 구독자 정보를 db 에 남기는 작업이 필요했다 한번에 10명 이상의 사용자에게 전송이 예상되기때문에 한번에 insert 를 하는 방법을 찾아봤다

//xorm
if rowsAffected, err := common.GetDB(ctx).InsertMulti(recipients); err != nil {
return errors.Wrap(err, "")
} else if rowsAffected == 0 {
return errors.New(" "등록에 실패하였습니다.")
}

출처

delete 설명field tag Golang xORM 편리한 기능 소개 | Popit gorm예시 delete예시 How to insert multiple data at once

© 2024 by GwiyeomGo Tech Blog. All rights reserved.