Golang(Go) 에서 xorm 으로 crud 만들기
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
- Saved 상태,Registed 상태가 존재
- Saved 상태의 수정 프로세스
- 수정할 값만 body로 요청
- 값 bind 후 유효성 검사 => require 값을 피하기위해 상태가 Saved 일경우 Validate 안하도록 조건 추가
- 신청 id 로 내용을 조회 => db에 기록된 신청 상태가 Registered면 에러가 나도록 변경
- 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 = 100db.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는 뭐지?
//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 를 하는 방법을 찾아봤다
//xormif 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