
рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ PostgreSQL рдХреЗ рд╕рд╛рде), рдореБрдЭреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ (рдЧреЛ рдЧреЛрдЗрдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред рдФрд░ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛, "рдХреНрдпрд╛ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдЧреЛрд░реЛрдЗрди рдореЗрдВ рдирдореВрдирд╛ рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рд╕реНрдХреИрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ?"
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛,
рдлрдВрдХ (* рдкрдВрдХреНрддрд┐рдпрд╛рдБ) рд╕реНрдХреИрди рдХреЛ рд▓реМрдХреА рдореЗрдВ рдПрдХ рд╕рд╛рде рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдореИрдВрдиреЗ рд╕реНрдХреИрдирд┐рдВрдЧ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдЕрдиреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдкрд░рд┐рдгрд╛рдореА рдбреЗрдЯрд╛ рдХреА рддреИрдпрд╛рд░реАред
рдХреНрдпреЛрдВрдХрд┐ рдмрд┐рдВрджреБ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рдореИрдВрдиреЗ рджреЛ рд╕реНрд▓рд╛рдЗрд╕ рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ (рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ рдХрд┐ рджреЛ рдмрд╛рдж рдореЗрдВ рдХреНрдпреЛрдВ), рдЬрд┐рд╕рдХреЗ рдмреАрдЪ рдореЗрдВ рдореИрдВ рд╕реНрдХреИрди рд╕реНрд╡рд┐рдЪ рдХрд░реВрдВрдЧрд╛, рдЬрдмрдХрд┐ рдмрд╛рдХреА рдХреЗ рд▓реМрдХреА рдкрд╣рд▓реЗ рд╕реЗ рдЪреБрдиреЗ рдЧрдП рдбреЗрдЯрд╛ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореБрдЭреЗ рдирдореВрдирд╛ рд╕реНрддрдВрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
columns, err = rows.Columns() count := len(columns)
рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВ рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рдФрд░ рдЗрди рдорд╛рдиреЛрдВ рдкрд░ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рджреЛ рд╕реНрд▓рд╛рдЗрд╕ рдмрдирд╛рддрд╛ рд╣реВрдВ (рдЬрд╣рд╛рдВ рдореИрдВ рдкрдВрдХреНрддрд┐ рд╕реНрдХреИрдирд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдбреЗрдЯрд╛ рдЬреЛрдбрд╝реВрдВрдЧрд╛):
values := make([]interface{}, count) valuesPtrs := make([]interface{}, count) values_ := make([]interface{}, count) valuesPtrs_ := make([]interface{}, count) for i := range columns { valuesPtrs[i] = &values;[i] valuesPtrs_[i] = &values;_[i] }
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдЪрдпрди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдорд╛рдирдЪрд┐рддреНрд░ [рд╕реНрдЯреНрд░рд┐рдВрдЧ] рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛, рдЬрд╣рд╛рдВ рдХреЙрд▓рдо рдирд╛рдо рдХреБрдВрдЬреА рд╣реЛрдВрдЧреЗред рдЖрдк рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рджрд░реНрд╢рд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд╢рди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдпрд╣ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд┐рддрдирд╛ рд╡реНрдпрд╡рд╣рд╛рд░реНрдп рд╣реИ, рдЖрдЗрдП рд╣рдо рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдЪрдпрди рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред
рдЕрдЧрд▓рд╛, рдореИрдВ рджреЛ рдЧреЛрд░реЛрддреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдкрд░рд┐рдгрд╛рдореА рдирдХреНрд╢рд╛ рдмрдирд╛рдПрдЧрд╛:
func getData(deleteNullValues bool, check, finish chan bool, dbData chan interface{}, columns []string, data *[]map[string]string) { lnc := len(columns) for <-check { row := make(map[string]string) for i := 0; i < lnc; i++ { el := <-dbData b, ok := el.([]byte) if ok { row[columns[i]] = string(b) } else { if el == nil { if deleteNullValues == false { row[columns[i]] = "" } } else { row[columns[i]] = fmt.Sprint(el) } } } *data = append(*data, row) } finish <- true }
рдФрд░ рджреВрд╕рд░рд╛ рд╕реНрд▓рд╛рдЗрд╕ рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рджреЛ рд╕реНрд▓рд╛рдЗрд╕реЛрдВ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкрд┐рдЫрд▓реЗ рд▓реМрдХреА рдХреЗ рд▓рд┐рдП рдЪреИрдирд▓ рдкрд░ рднреЗрдЬ рджреЗрдЧрд╛ (рдЬреЛ рдкрд░рд┐рдгрд╛рдо рдмрдирд╛рддрд╛ рд╣реИ):
func transferData(values, values_ []interface{}, dbData chan interface{}, swtch, working, check chan bool) { for <-working { check <- true switch <-swtch { case false: for _, v := range values { dbData <- v } default: for _, v := range values_ { dbData <- v } } } }
рдореБрдЦреНрдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдФрд░ рд╕реНрд▓реЗрдХреНрдЯ рдбреЗрдЯрд╛ рдХреЗ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдЧреА:
for rows.Next() { switch chnl { case false: if err = rows.Scan(valuesPtrs...); err != nil { fmt.Printf("rows.Scan: %s\n%s\n%#v\n", err, query, args) return nil, nil, err } default: if err = rows.Scan(valuesPtrs_...); err != nil { fmt.Printf("rows.Scan: %s\n%s\n%#v\n", err, query, args) return nil, nil, err } } working <- true swtch <- chnl chnl = !chnl }
рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ, рдореИрдВрдиреЗ 32 рд╕реНрддрдВрднреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рдмрдирд╛рдИ рдФрд░ рдЗрд╕рдореЗрдВ 100k рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рд╛ред
рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк (рдЬрдм рдбреЗрдЯрд╛ рдХрд╛ рдирдореВрдирд╛ 50 рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рддреЛ рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рдорд┐рд▓рд╛:
рд╕рдордп рд╡реНрдпрддреАрдд: 1m8.022277124s - рдПрдХрд▓ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдирд╛
рд╕рдордп рд╡реНрдпрддреАрдд: 1m7.806109441s - рджреЛ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдирдореВрдирд╛ рд▓реЗрдирд╛
100 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде:
рд╕рдордп рд╡реНрдпрддреАрдд: 2m15.973344023s - рдПрдХ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЪрдпрди
рд╕рдордп рдмрд┐рддрд╛рдпрд╛: 2m15.057413845s - рджреЛ рд╕реНрд▓рд╛рдЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдирдореВрдирд╛
рдбреЗрдЯрд╛ рдХреА рдмрдврд╝рддреА рдорд╛рддреНрд░рд╛ рдФрд░ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ рдмрдврд╝рддреЗ рдХреЙрд▓рдо рдХреЗ рд╕рд╛рде рдЕрдВрддрд░ рдмрдврд╝рддрд╛ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рдкрд░реАрдд рдкрд░рд┐рдгрд╛рдо рдбреЗрдЯрд╛ рдХреА рдорд╛рддреНрд░рд╛ рдореЗрдВ рдХрдореА рдпрд╛ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рд╕реНрддрдВрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХрдореА рдХреЗ рд╕рд╛рде рджреЗрдЦрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рддреИрдпрд╛рд░реА рдХреЗ рдХрджрдореЛрдВ рдФрд░ рдкреЗрдЯреВ рд╡рд┐рднрд╛рдЧ рдХреЗ рдУрд╡рд░рд╣реЗрдб "рдЦрд╛рдУ" рдХреАрдорддреА рд╕рдордп рдФрд░ рдкрд░рд┐рдгрд╛рдо рд╕рдорддрд▓ рд╣реИред
рджреЛ рд╕реНрд▓рд╛рдЗрд╕ рдФрд░ рджреЛ рдЧреЛрд░реЛрдЯрд┐рдВрд╕ рдХреЗ рд░реВрдк рдореЗрдВ: рдореИрдВрдиреЗ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕реНрд▓рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдирдореВрдирд╛ рд╕рдордп рдореЗрдВ рд╡реГрджреНрдзрд┐ рд╣реБрдИ, рдХреНрдпреЛрдВрдХрд┐, рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЧреЗрдЯрдбрд╛рдЯрд╛ рдФрд░ рдЯреНрд░рд╛рдВрд╕рдлрд╝рд░рдбрд╛рдЯрд╛ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдбреЗрдЯрд╛ рдХреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕реНрдХреИрдирд┐рдВрдЧ рдорд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рддреЗрдЬреА рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдХреЛрд░ рдХреЗ рд╕рд╛рде, рдпрд╣ рд╕реНрдХреИрди рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреЛрд░реЛрдЗрдЯрд┐рди (рдмрд╣реБрдд рдЬрдВрдЧрд▓реА рдбреЗрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░) рдХреЗ рд▓рд┐рдП рдирдП рд╕реНрд▓рд╛рдЗрд╕ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред
рдЬреАрдердм рдХреЛрдб рдореЗрдВ, рдореИрдВ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг
рдХрд╛ рдПрдХ
рдХрд╛рд░реНрдпрд╢реАрд▓ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реВрдВред рдореЗрд░реЗ рдХрд╛рд░реНрдп рдЕрдиреНрдп рдкреИрдХреЗрдЬреЛрдВ рдХрд╛ рднреА рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВрдиреЗ рдКрдкрд░ рд╕реЗ рд╕рд╛рдл рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЗрд╕рд╕реЗ рдкреАрдбрд╝рд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВ рдЗрдЪреНрдЫреБрдХ рд╕рдореБрджрд╛рдп рд╕реЗ рд░рдЪрдирд╛рддреНрдордХ рдЖрд▓реЛрдЪрдирд╛ рдХреА рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВред рдзрдиреНрдпрд╡рд╛рдж!