골랑 - GORM

4239 단어

머리말



정확한 문제 해결을 위해서는 현재 요청 정보와 현재 실행 중인 SQL 정보 간의 해당 관계를 기록해야 합니다. 기록된 SQL 정보에는 다음이 포함됩니다.

SQL 실행의 현재 시간.
  • SQL 실행을 위한 파일 주소 및 줄 번호.
  • SQL을 실행하는 데 걸리는 시간.
  • SQL 실행의 영향을 받는 행 수입니다.
  • SQL 문이 실행되었습니다.

  • 데이터베이스 구성 요소가 사용됩니다GORM.

    아이디어


  • SQL을 실행하기 전에 실행 시작 시간을 설정하십시오(실행 시간을 계산하는 데 사용됨).
  • SQL 실행 후 먼저 현재 요청의 컨텍스트를 가져오고 컨텍스트를 가져오는 이유는 컨텍스트에서 요청 정보를 가져와야 하기 때문에 두 번째, SQL 실행 전 시간을 가져와 실행 시간을 계산하는 것, 세 번째 , SQL 실행 정보를 얻은 다음 데이터 Tracein Tracea 프로젝트 링크 패킷을 설정하면 기사 뒷부분에서 소개됩니다.

  • 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

    좋은 웹페이지 즐겨찾기