Mysql: * sql.DB рдЕрдорд╛рдиреНрдп рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рдпрд╛ рдиреАрд▓ рдкреЙрдЗрдВрдЯрд░ рдбреЗрд░реЗрдлреЗрд░реЗрдВрд╕

рдХреЛ рдирд┐рд░реНрдорд┐рдд 2 рдирд╡ре░ 2013  ┬╖  21рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: go-sql-driver/mysql

// рдлрд╝рд╛рдЗрд▓ /User/jinke/golang/src/cds_spider/common/dbpool/mysql.go

package dbpool

import (
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)

var DB *sql.DB

func init() {
    db, err := sql.Open("mysql", "root:123456@tcp(192.168.1.20:3306)/?charset=utf8")
    if err != nil {
        panic("dbpool init >> " + err.Error())
    }
    DB = db
    DB.SetMaxIdleConns(5)
}

// рдлрд╝рд╛рдЗрд▓ /User/jinke/golang/src/cds_spider/newCar/koubei/koubei.go

package koubei

import (
    "cds_spider/common/dbpool"
)

type KouBei struct {
    Auto_koubei_id                                               int
    Source                                                       string
    Auto_brand_id, Auto_company_id, Auto_serial_id, Auto_type_id int
    Username                                                     string
    Price                                                        float64
    Province_id, City_id                                         int
    Buy_date, Content, Spider_url, Created                       string
    Level                                                        int
}

func (k *KouBei) Save() (insertID int64, err error) {
    stmt, err := dbpool.DB.Prepare("INSERT mains.koubei SET source=?, auto_brand_id=?, auto_company_id=?, auto_serial_id=?, auto_type_id=?, username=?, price=?, province_id=?, city_id=?, buy_date=?, content=?, level=?, spider_url=?")
    if err != nil {
        return 0, err
    }
    defer stmt.Close()

    res, err := stmt.Exec(k.Source, k.Auto_brand_id, k.Auto_company_id, k.Auto_serial_id, k.Auto_type_id, k.Username, k.Price, k.Province_id, k.City_id, k.Buy_date, k.Content, k.Level, k.Spider_url)
    if err != nil {
        return 0, err
    }
    return res.LastInsertId()
}

"stmt, рдЗрд░реЗрдЯ: = dbpool.DB.Prepare" рддреНрд░реБрдЯрд┐ рдЕрдорд╛рдиреНрдп рдореЗрдореЛрд░реА рдПрдбреНрд░реЗрд╕ рдпрд╛ рдПрдирдПрд▓ рдкреЙрдЗрдВрдЯрд░ рдбреЗрд░реЗрдлреЗрд░реЗрдВрд╕ рд╣реИ

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x41 pc=0x52fb5c]

goroutine 2208 [running]:
github.com/go-sql-driver/mysql.(*mysqlConn).writeCommandPacketUint32(0x0, 0x1048eca19, 0xc2046b8330, 0x2ba32ae35a88)
    /Users/jinke/golang/src/github.com/go-sql-driver/mysql/packets.go:327 +0x1c
github.com/go-sql-driver/mysql.(*mysqlStmt).Close(0xc200e3ba50, 0x0, 0x0)
    /Users/jinke/golang/src/github.com/go-sql-driver/mysql/statement.go:24 +0x46
database/sql.(*driverConn).finalClose(0xc2020d5cc0, 0xc20370d900, 0x2bbc7f0)
    /usr/local/go/src/pkg/database/sql/sql.go:285 +0x87
database/sql.func┬╖002(0xc2000ca200, 0xc2000aebd0)
    /usr/local/go/src/pkg/database/sql/sql.go:372 +0x2c
database/sql.(*driverConn).Close(0xc2020d5cc0, 0x3, 0x4a173d)
    /usr/local/go/src/pkg/database/sql/sql.go:278 +0x174
database/sql.(*DB).putConn(0xc2000ca1e0, 0xc2020d5cc0, 0x0, 0x0)
    /usr/local/go/src/pkg/database/sql/sql.go:598 +0x2e2
database/sql.(*DB).prepare(0xc2000ca1e0, 0x742450, 0xd2, 0xc20035ba50, 0x85, ...)
    /usr/local/go/src/pkg/database/sql/sql.go:640 +0x267
database/sql.(*DB).Prepare(0xc2000ca1e0, 0x742450, 0xd2, 0x4b2488, 0xc2000ae140, ...)
    /usr/local/go/src/pkg/database/sql/sql.go:608 +0x5a
cds_spider/newCar/koubei.(*KouBei).Save(0xc2046ab790, 0x0, 0x0, 0x0)
    /Users/jinke/golang/src/cds_spider/newCar/koubei/koubei.go:20 +0x6b

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

@ рдореАрдереЗрди , рдЖрдк рд╕рд╣реА рдереЗ, рдореБрдЭреЗ db, err := [...] db, err = [...] рд╕рд╛рде рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдореЗрд░реА рдЦрд░рд╛рдм, рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ред

рд╕рднреА 21 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдЪрд╛рд╣рд┐рдП:

  • рдЖрдкрдХрд╛ Go-MySQL- рдбреНрд░рд╛рдЗрд╡рд░ рд╕рдВрд╕реНрдХрд░рдг (рдпрд╛ git SHA)
  • рдЖрдкрдХрд╛ рдЧреЛ рд╕рдВрд╕реНрдХрд░рдг (рдЕрдкрдиреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ go version рдЪрд▓рд╛рдПрдВ)

рдЧреЛ рд╕рдВрд╕реНрдХрд░рдг
Go-MySQL-Driver рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рд╣реИ

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрддрдВрдХ v1.0.3 рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рдХрд▓ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдПрдХ рдмрдЧрдлрд┐рдХреНрд╕ рд░рд┐рд▓реАрдЬ (рдХреБрдЫ рдорд┐рдирдЯреЛрдВ рдХреЗ рдмрд╛рдж рд╕реЗ ( go get -able) рд╣реИред

рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдЧреЗ рдХреА рдЬрд╛рдВрдЪ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд╕реНрдЯреИрдХрдЯреНрд░реЗрд╕ рдореЗрд░реЗ рд▓рд┐рдП рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЬреАрдм рд▓рдЧ рд░рд╣рд╛ рд╣реИред рдЖрддрдВрдХ nil stmt.Close ( mc рдЪрд░ nil рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред

v1.0.3 рдХрдо рд╕реЗ рдХрдо рдиреАрд▓-рдкреЙрдЗрдВрдЯрд░ рдШрдмрд░рд╛рд╣рдЯ рдХреЛ рд░реЛрдХ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ mc == nil рдкрд╣рд▓реЗ рдЪреЗрдХ рдХрд░рддрд╛ рд╣реИред

рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдкреБрди: рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ?

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xb code=0x1 addr=0x41 pc=0x5304bc]
goroutine 25466 [running]:
github.com/go-sql-driver/mysql.(*mysqlConn).writeCommandPacketUint32(0x0, 0x305e92619, 0xc22b2fe650, 0x2b8b3c6167c0)
    /Users/jinke/golang/src/github.com/go-sql-driver/mysql/packets.go:327 +0x1c
github.com/go-sql-driver/mysql.(*mysqlStmt).Close(0xc22b87a6f0, 0x0, 0x0)
    /Users/jinke/golang/src/github.com/go-sql-driver/mysql/statement.go:24 +0x46
database/sql.(*driverConn).finalClose(0xc202a42780, 0xc2014fd1c0, 0x2210b5a80)
    /usr/local/go/src/pkg/database/sql/sql.go:Jump {0 autohome 25 44 258 1977 hkyjh 12.68 394 397 2011-9-27  http://k.autohome.com.cn/spec/8288/hkyjh 2013-11-02 14:21:38 6}
285 +0x87
database/sql.func┬╖002(0xc2000ca200, 0xc2000aebd0)
    /usr/local/go/src/pkg/database/sql/sql.go:372 +0x2c
database/sql.(*driverConn).Close(0xc202a42780, 0x32, 0x9)
    /usr/local/go/src/pkg/database/sql/sql.go:278 +0x174
database/sql.(*DB).putConn(0xc2000ca1e0, 0xc202a42780, 0x0, 0x0)
    /usr/local/go/src/pkg/database/sql/sql.go:598 +0x2e2
database/sql.func┬╖004()
    /usr/local/go/src/pkg/database/sql/sql.go:664 +0x41
database/sql.(*DB).exec(0xc2000ca1e0, 0x738330, 0x40, 0x2b8b3c616cb8, 0x2, ...)
    /usr/local/go/src/pkg/database/sql/sql.go:661 +0xb2
database/sql.(*DB).Exec(0xc2000ca1e0, 0x738330, 0x40, 0x2b8b3c616cb8, 0x2, ...)
    /usr/local/go/src/pkg/database/sql/sql.go:650 +0x98
cds_spider/newCar/koubei.AddOk(0x6dee10, 0x8, 0x1, 0x0, 0x0, ...)
    /Users/jinke/golang/src/cds_spider/newCar/koubei/log.go:49 +0x568
cds_spider/newCar/koubei.(*KouBei).Save(0xc20a0a74d0, 0x0, 0x0, 0x0)
    /Users/jinke/golang/src/cds_spider/newCar/koubei/koubei.go:29 +0x3b7
main.func┬╖006()
    /Users/jinke/golang/src/cds_spider/newCar/koubei/main/autohome.go:241 +0x37
created by main.func┬╖007

/Users/jinke/golang/src/cds_spider/newCar/koubi.log.go

func AddOk(source string, count int) error {
    row := dbpool.DB.QueryRow("SELECT * FROM cheduoshao_spider_status.koubei WHERE source=? AND spider_date=?", source, gcode.Date())
    var (
        id, quantity         int
        sources, spider_date string
    )

    row.Scan(&id, &sources, &quantity, &spider_date)

    if id == 0 {
        stmt, err := dbpool.DB.Prepare("INSERT cheduoshao_spider_status.koubei SET source=?, quantity=?, spider_date=?")
        if err != nil {
            return err
        }
        defer stmt.Close()

        _, err = stmt.Exec(source, 1, gcode.Date())
        if err != nil {
            return err
        }
    } else { 
        dbpool.DB.Exec("UPDATE main.koubei SET quantity=? WHERE id=?", quantity+1, id)
    }

    return nil
}

dbpool.DB.Exec ("UPDATE main.koubei SET рдорд╛рддреНрд░рд╛ =? WHERE id =?", quant + 1, id) IS ERROR

рдкрд╣рд▓реЗ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдирд╣реАрдВ рдорд┐рд▓реА рд╣реИ, рдореЗрд░рд╛ рд╕рд┐рд╕реНрдЯрдо OS X 10.9 рд╣реИ

рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ row.Scan(&id, &sources, &quantity, &spider_date) рдПрдХ рддреНрд░реБрдЯрд┐ рджреЗрддрд╛ рд╣реИред
рдХреНрдпрд╛ рдЖрдкрдиреЗ v1.0.3 рдХреА рдХреЛрд╢рд┐рд╢ рдХреА? рдЬреИрд╕рд╛ рдореИрдВрдиреЗ рдХрд╣рд╛, рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдкреИрдирд┐рдХ рд╕реЗ рдмрдЪрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВрдиреЗ рдХреБрдЫ рдмрд╛рд░ рдФрд░ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛, рдореИрдВ рдЕрднреА рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд▓реЗрддрд╛ рд╣реВрдВ
рдореИрдВрдиреЗ рдЗрд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛:

err := row.Scan(&id, &sources, &quantity, &spider_date)
    if err != nil {
        return err
    }

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕ рдмрдЧ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛ред рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рдпрд╣ рдмрдЧ https://codereview.appspot.com/14920046 / Go рдЗрд╢реНрдпреВ 5718 (рдпрд╛ # 98, # 142) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред
stmt.Exec рдбреНрд░рд╛рдЗрд╡рд░ рджреНрд╡рд╛рд░рд╛ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреВрд▓ рдореЗрдВ рд╡рд╛рдкрд╕ рдЦрд░рд╛рдм рдХрдиреЗрдХреНрд╢рди рдбрд╛рд▓рддрд╛ рд╣реИред

v1.0.3 рдореЗрдВ # 143 рд╢рд╛рдорд┐рд▓ рд╣реИ, рдЬреЛ рдХрдо рд╕реЗ рдХрдо рдкреИрдирд┐рдХ рд╕реЗ рдмрдЪрддрд╛ рд╣реИред v1.1, рдЬреЛ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдЗрд╕рдореЗрдВ # 151 рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧрд╛, рдЬреЛ рдЗрд╕реЗ рдереЛрдбрд╝рд╛ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рддрд╛ рд╣реИред

рдореИрдВ рдпрд╛ рддреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдЧреЛ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ https://codereview.appspot.com/14920046 рдХреЗ рд╕рд╛рде рдкреИрдЪ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ stmt.Exec рд╕реЗ рдмрдЪреВрдВрдЧрд╛ред рд╡рд╣ рд╢рд╛рдпрдж рдЬреВрди 2014 рдореЗрдВ Go 1.3 рд╣реЛрдЧрд╛ ...

рдФрд░ рдКрдкрд░ рдЕрдкрдиреЗ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЛрдЯ:
рдпрджрд┐ рдЖрдк stmt рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИред рдмрд╕ db.Exec , рдЬреЛ рдХрд┐ stmt.Exec рддрд░рд╣ рдмрдЧ рди рд╣реЛред

рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдКрдкрд░ рдХреИрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░реВрдВрдЧрд╛:

func AddOk(source string, count int) error {
    var (
        id, quantity         int
        sources, spider_date string
    )
    if err := dbpool.DB.QueryRow("SELECT * FROM cheduoshao_spider_status.koubei WHERE source=? AND spider_date=?", source, gcode.Date()).Scan(&id, &sources, &quantity, &spider_date); err != nil {
        return err
    }

    if id == 0 {
        if _, err =: dbpool.DB.Exec("INSERT cheduoshao_spider_status.koubei SET source=?, quantity=?, spider_date=?", source, 1, gcode.Date()); err != nil {
            return err
        }
    } else { 
        if _, err =: dbpool.DB.Exec("UPDATE main.koubei SET quantity=? WHERE id=?", quantity+1, id); err != nil {
            return err
        }
    }

    return nil
}

рдареАрдХ рд╣реИ рдзрдиреНрдпрд╡рд╛рдж!

рдореБрдЭреЗ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рд╣реЛ рд░рд╣реА рд╣реИ, рдЧреЛ рд╕рдВрд╕реНрдХрд░рдг go1.7.4 linux/amd64 рдФрд░ рдЧреЛ- sql- рдбреНрд░рд╛рдЗрд╡рд░ рдирд╡реАрдирддрдо рд╣реИред рдореИрдВ AWS рдХреЗ RDS рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдЬреБрдбрд╝ рд░рд╣рд╛ рд╣реВрдБред

runtime error: invalid memory address or nil pointer dereference
/usr/local/go/src/runtime/panic.go:458 (0x42c653)
    gopanic: reflectcall(nil, unsafe.Pointer(d.fn), deferArgs(d), uint32(d.siz), uint32(d.siz))
/usr/local/go/src/runtime/panic.go:62 (0x42b1ad)
    panicmem: panic(memoryError)
/usr/local/go/src/runtime/sigpanic_unix.go:24 (0x441054)
    sigpanic: panicmem()
/usr/local/go/src/database/sql/sql.go:781 (0x557d0a)
    (*DB).conn: db.mu.Lock()
/usr/local/go/src/database/sql/sql.go:1074 (0x559fbb)
    (*DB).query: ci, err := db.conn(strategy)
/usr/local/go/src/database/sql/sql.go:1062 (0x559dc0)
    (*DB).Query: rows, err = db.query(query, args, cachedOrNewConn)
/home/danilo/Go/src/github.com/DaniloMeritocracy/autocomplete/autocomplete.go:192 (0x402e27)
    _getJSON: rows, err := db.Query(sqlString)
/home/danilo/Go/src/github.com/DaniloMeritocracy/autocomplete/autocomplete.go:130 (0x402b54)
    school: res, err := _getJSON("SELECT * FROM university WHERE LOWER(name) LIKE '" + strings.Replace(term, "'", "\\'", -1) + "%' LIMIT 15")
/home/danilo/Go/src/github.com/DaniloMeritocracy/autocomplete/autocomplete.go:56 (0x403985)
    main.func1: results = school(term)
/home/danilo/Go/src/gopkg.in/gin-gonic/gin.v1/context.go:97 (0x45d53a)
    (*Context).Next: c.handlers[c.index](c)
/home/danilo/Go/src/gopkg.in/gin-gonic/gin.v1/recovery.go:45 (0x46d31a)
    RecoveryWithWriter.func1: c.Next()
/home/danilo/Go/src/gopkg.in/gin-gonic/gin.v1/context.go:97 (0x45d53a)
    (*Context).Next: c.handlers[c.index](c)
/home/danilo/Go/src/gopkg.in/gin-gonic/gin.v1/logger.go:72 (0x46c40f)
    LoggerWithWriter.func1: c.Next()
/home/danilo/Go/src/gopkg.in/gin-gonic/gin.v1/context.go:97 (0x45d53a)
    (*Context).Next: c.handlers[c.index](c)
/home/danilo/Go/src/gopkg.in/gin-gonic/gin.v1/gin.go:284 (0x4638ce)
    (*Engine).handleHTTPRequest: context.Next()
/home/danilo/Go/src/gopkg.in/gin-gonic/gin.v1/gin.go:265 (0x4631b0)
    (*Engine).ServeHTTP: engine.handleHTTPRequest(c)
/usr/local/go/src/net/http/server.go:2202 (0x4e1fdd)
    serverHandler.ServeHTTP: handler.ServeHTTP(rw, req)
/usr/local/go/src/net/http/server.go:1579 (0x4de947)
    (*conn).serve: serverHandler{c.server}.ServeHTTP(w, w.req)
/usr/local/go/src/runtime/asm_amd64.s:2086 (0x45c0f1)
    goexit: BYTE    $0x90   // NOP

рдпрд╣ рдлрд╝рдВрдХреНрд╢рди _getJSON рд╣реИ , рдЬреЛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ JSON-Encoded рд╕реНрдЯреНрд░рд┐рдВрдЧ рджреЗрддрд╛ рд╣реИ:

func _getJSON(sqlString string) (string, error) {
    rows, err := db.Query(sqlString)
    if err != nil {
        return "", err
    }
    defer rows.Close()
    columns, err := rows.Columns()
    if err != nil {
        return "", err
    }
    count := len(columns)
    tableData := make([]map[string]interface{}, 0)
    values := make([]interface{}, count)
    valuePtrs := make([]interface{}, count)
    for rows.Next() {
        for i := 0; i < count; i++ {
            valuePtrs[i] = &values[i]
        }
        rows.Scan(valuePtrs...)
        entry := make(map[string]interface{})
        for i, col := range columns {
            var v interface{}
            val := values[i]
            b, ok := val.([]byte)
            if ok {
                v = string(b)
            } else {
                v = val
            }
            entry[col] = v
        }
        tableData = append(tableData, entry)
    }
    jsonData, err := json.Marshal(tableData)
    if err != nil {
        return "", err
    }
    //fmt.Println(string(jsonData))
    return string(jsonData), nil
}

@DaniloPolani рдЖрдкрдХрд╛ db рд╢реВрдиреНрдп рд╣реИред

рдпрд╣ рд╢реВрдиреНрдп рдХреНрдпреЛрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП? рдореЗрд░реЗ рдкрд╛рд╕ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд╛рд╣рд░ рдПрдХ db var var db *sql.DB рдФрд░ рдореБрдЦреНрдп рджреБрд░реНрдЧрдВрдз рдореЗрдВ рдореИрдВрдиреЗ рдХрдиреЗрдХреНрд╢рди рдЦреЛрд▓рд╛ рд╣реИ

db, err := sql.Open("mysql", "<USERNAME>:<PASSWORD>@tcp(<HOST>:3306)/<DB_NAME>")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

рддрдм рдЗрд╕реЗ _getJSON() рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдХреНрд░реЗрдбреЗрдВрд╢рд┐рдпрд▓ рдареАрдХ рд╣реИрдВред рд╢рд╛рдпрдж рдпрд╣ AWS рд╕рдорд╕реНрдпрд╛ рд╣реИ? рдореИрдВ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдХреЗ рд╕рд╛рде рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ред

db, err := sql.Open("mysql", "<USERNAME>:<PASSWORD>@tcp(<HOST>:3306)/<DB_NAME>")

рдлрд┐рд░, db рдореБрдЦреНрдп рдХрд╛ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рд╣реИ, рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ _getJSON() рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВред

рдЬрдм рдЖрдк рдкреВрд░реНрдг рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреЛрдб рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрдИ рднреА рдЗрдВрдЧрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ
рдЬрд╣рд╛рдВ рдЖрдкрдХреЗ рдХреЛрдб рдореЗрдВ рджреМрдбрд╝ рдХреА рд╕реНрдерд┐рддрд┐ рд╣реИред
go build -race рдЖрдкрдХрд╛ рджреЛрд╕реНрдд рд╣реИред

@ рдореАрдереЗрди , рдЖрдк рд╕рд╣реА рдереЗ, рдореБрдЭреЗ db, err := [...] db, err = [...] рд╕рд╛рде рднреА рддреНрд░реБрдЯрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереАред рдореЗрд░реА рдЦрд░рд╛рдм, рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ред

рдмрд╕ рдПрдХ рд╣реА рдореБрджреНрджреЗ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ред рд╣реИрд░рд╛рдиреА рд╣реБрдИ рдХрд┐ рдпрд╣ рдореБрджреНрджрд╛ рдерд╛ред
@Danilopolani рджреНрд╡рд╛рд░рд╛ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

@danilopolani @methane рдЖрдк рд▓реЛрдЧреЛрдВ рдиреЗ рдореЗрд░рд╛ рд╕рдордп рдмрдЪрд╛рдпрд╛

@danilopolani рдЖрдк рд╕рд╣реА рд╣реИрдВ, рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЦреЛрдЬ рд░рд╣рд╛ рд╣реВрдВ, рдзрдиреНрдпрд╡рд╛рдж

рдПрдХ рд╣реА рдореБрджреНрджреЗ рдореЗрдВ рдЪрд▓ рд░рд╣рд╛ рд╣реИ .. рдореИрдВ @danilopolani рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реВрдВ?

рдзрдиреНрдпрд╡рд╛рдж @methane @danilopolani рдореИрдВрдиреЗ рд╡рд╣реА рдЧрд▓рддреА рдХреА, рд╕реМрднрд╛рдЧреНрдп рд╕реЗ рдореБрдЭреЗ рдпрд╣ рдЪрд░реНрдЪрд╛ рдорд┐рд▓реАред

OMG, рдореИрдВ рдХрднреА рдХрд▓реНрдкрдирд╛ рднреА рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рдерд╛ рдХрд┐ рд╕рдорд╛рдзрд╛рди рд╡реИрд░рд┐рдПрдмрд▓ рд╕реНрдХреВрдкрд┐рдВрдЧ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдерд╛ред
рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж рд▓рдбрд╝рдХреЛрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

victormongi picture victormongi  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

tnerolftnerolf picture tnerolftnerolf  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

BSick7 picture BSick7  ┬╖  8рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jaysonShao picture jaysonShao  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Dieterbe picture Dieterbe  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ