골랑 - GORM
머리말
정확한 문제 해결을 위해서는 현재 요청 정보와 현재 실행 중인 SQL 정보 간의 해당 관계를 기록해야 합니다. 기록된 SQL 정보에는 다음이 포함됩니다.
SQL 실행의 현재 시간.
데이터베이스 구성 요소가 사용됩니다GORM.
아이디어
GORM 두 지식 포인트 콜백 및 컨텍스트를 사용해야 하는 경우 이 두 가지는 GORM V2 패키지를 가져오기만 하면 됩니다. gorm.io/gorm.
데모 코드
컨텍스트 전송에는 Context() 메소드와 함께 제공되는 GORM V2가 필요합니다.
func (u *userRepo) getUserByID(ctx core.Context, id uint) (*user_model.UserDemo, error) {
data := new(user_model.UserDemo)
err := u.db.GetDbR().WithContext(ctx).First(data, id).Error
if err != nil {
return nil, errors.Wrap(err, "[user_demo] get user data err")
}
return data, nil
}
GORM 플러그인 인터페이스로 작성된 CallBacks 플러그인 코드 작성은 매우 간단하며 두 가지 방법만 구현하면 됩니다.
// Plugin GORM plugin interface
type Plugin interface {
Name() string
Initialize(*DB) error
}
아래는 내가 작성한 플러그인 코드입니다.
type TracePlugin struct{}
func (op *TracePlugin) Name() string {
return "tracePlugin"
}
func (op *TracePlugin) Initialize(db *gorm.DB) (err error) {
// Before starting
_ = db.Callback().Create().Before("gorm:before_create").Register(callBackBeforeName, before)
_ = db.Callback().Query().Before("gorm:query").Register(callBackBeforeName, before)
_ = db.Callback().Delete().Before("gorm:before_delete").Register(callBackBeforeName, before)
_ = db.Callback().Update().Before("gorm:setup_reflect_value").Register(callBackBeforeName, before)
_ = db.Callback().Row().Before("gorm:row").Register(callBackBeforeName, before)
_ = db.Callback().Raw().Before("gorm:raw").Register(callBackBeforeName, before)
// after the end
_ = db.Callback().Create().After("gorm:after_create").Register(callBackAfterName, after)
_ = db.Callback().Query().After("gorm:after_query").Register(callBackAfterName, after)
_ = db.Callback().Delete().After("gorm:after_delete").Register(callBackAfterName, after)
_ = db.Callback().Update().After("gorm:after_update").Register(callBackAfterName, after)
_ = db.Callback().Row().After("gorm:row").Register(callBackAfterName, after)
_ = db.Callback().Raw().After("gorm:raw").Register(callBackAfterName, after)
return
}
var _ gorm.Plugin = &TracePlugin{}
func before(db *gorm.DB) {
db.InstanceSet(startTime, time.Now())
return
}
func after(db *gorm.DB) {
_ctx := db.Statement.Context
ctx, ok := _ctx.(core.Context)
if !ok {
return
}
_ts, isExist := db.InstanceGet(startTime)
if !isExist {
return
}
ts, ok := _ts.(time.Time)
if !ok {
return
}
sql := db.Dialector.Explain(db.Statement.SQL.String(), db.Statement.Vars...)
sqlInfo := new(trace.SQL)
sqlInfo.Timestamp = time_parse.CSTLayoutString()
sqlInfo.SQL = sql
sqlInfo.Stack = utils.FileWithLineNum()
sqlInfo.Rows = db.Statement.RowsAffected
sqlInfo.CostSeconds = time.Since(ts).Seconds()
ctx.Trace().AppendSQL(sqlInfo)
return
}
마지막으로 db가 연결되었을 때 이 플러그인을 사용하십시오.
// Use plugin
db.Use(&TracePlugin{})
요약
패키지의 추적 부분에 작성되었으며 이 패키지는 정보(JSON 형식)를 기록할 수 있습니다.
trace_id 설정 지원
지원 설정 요청 정보
지원 설정 응답 정보
정보 요청을 위한 third_party_requests 설정 지원
디버깅 정보를 인쇄하기 위해 디버그 설정 지원
SQL 정보를 실행하기 위한 sqls 설정 지원
cost_seconds 실행 시간을 기록할 수 있습니다.
위의 코드는 go-gin-api 프로젝트의 주소입니다.
github.com/xinliangnote/go-gin-api
더 보기Gorm tutorial
Reference
이 문제에 관하여(골랑 - GORM), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/f2k2game/go-lang-gorm-5gh0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)