рдореБрдЭреЗ db.sqlDB.Query () рдХреЙрд▓ рдХрд░рддреЗ рд╕рдордп рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ "рдЯреВ рдореИрди рдХрдиреЗрдХреНрд╢рди" рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣рд╛ рд╣реИред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рдЗрд╕ рдореБрджреНрджреЗ рдкрд░ рдФрд░ рдЦреБрджрд╛рдИ рдХрд░реВрдВ, рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ рдХреНрдпрд╛ рдХреЛрдИ рдЬреНрдЮрд╛рдд рдореБрджреНрджрд╛ рд╣реИред
рд╡рд┐рдЪрд╛рд░?
013/07/23 03:05:35 yy.UpdateThingy () db.go: 264 [XXXX рдореЗрдВ рд░рд┐рдХреЙрд░реНрдб рдбрд╛рд▓рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓: рддреНрд░реБрдЯрд┐ 1040: рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди]
рдореИрдВ рд╕рдВрд╕реНрдХрд░рдг 1.1.1 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ:
рдЬрд╛рдирд╛ рд╕рдВрд╕реНрдХрд░рдг go1.1.1 рд▓рд┐рдирдХреНрд╕ / 386
рдореИрдВ mysql рдбреНрд░рд╛рдЗрд╡рд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ:
v1.0.1
MySql рд╕рдВрд╕реНрдХрд░рдг:
рд╕рд░реНрд╡рд░ рд╕рдВрд╕реНрдХрд░рдг: 5.5.22-0ubuntu1 (рдЙрдмрдВрдЯреВ)
рдпрд╣рд╛рдБ рдореЗрд░реЗ рдПрдХ рдкреНрд░рд╢реНрди рдХрд╛ рдПрдХ рдирдореВрдирд╛ рд╣реИ:
рдкрдВрдХреНрддрд┐рдпрд╛рдБ, рдЧрд▓рдд =
db.sqlDB.Query ("XXXX (yyyy) рдорд╛рди рдореЗрдВ рдбрд╛рд▓реЗрдВ?")?
Connect.ZZZZ)
рдЕрдЧрд░ рдЧрд▓рдд рд╣реИ! = nil {
_ = row.Close ();
рдкрд░рд┐рдгрд╛рдо, рдЗрд░реЗрдЯ
}
_ = row.Close ();
рдореИрдВрдиреЗ "row.Close ()" рдХреЛ рдЬреЛрдбрд╝рд╛, рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХреЛрдИ рдкрд╛рд╕рд╛ рдирд╣реАрдВред
FYI рдХрд░реЗрдВ, рдореЗрд░реЗ рдХреБрдЫ рдкреНрд░рд╢реНрди "row.Scan" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред
рдХреГрдкрдпрд╛ рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: https://github.com/VividCortex/go-database-sql-tutorial
ред
рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╡рд░реНрддреА рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдорд╡рд░реНрддреА рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ / рдПрд╕рдХреНрдпреВрдПрд▓ рдкреИрдХреЗрдЬ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрд╡рд░реБрджреНрдз-рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ / рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрджреНрдпрддрди рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдВрдЧреЗред
рд╕рдВрднрд╡рдд: рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд┐рд░реНрдл рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рд▓реАрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк rows
db.Query
рдпрд╛ рд▓реЗрдирджреЗрди рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ ( рдбреЗрдЯрд╛рдмреЗрд╕ / sql рдХреЗ tx api рдореЗрдВ )ред
рдореЗрд░реА рд╕рд╛рдорд╛рдиреНрдп рд╕рд▓рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ
db.Exec
рдпрджрд┐ рдЖрдк рдПрдХ рд▓реМрдЯреА рд╣реБрдИ рдкрдВрдХреНрддрд┐ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЖрдк Scan
рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрдиреЗрдХреНрд╢рди рдореБрдлреНрдд рд╣реИредdb.QueryRow
рдпрджрд┐ рдЖрдк рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЬрдВрдЬреАрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрдиреЗрдХреНрд╢рди рд▓реАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗdb.Query
рдпрджрд┐ рдЖрдк рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ rows.Next
рд▓реВрдкрд┐рдВрдЧ) рдпрд╛ rows.Close
рдХреЙрд▓ рдХрд░реЗрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, rows.Close
рдХреЙрд▓ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рддреНрд░реБрдЯрд┐-рдорд╛рдорд▓реЛрдВ рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛редрдореИрдВрдиреЗ "db.Query ()" рдХреЛ "db.Prepare () рдФрд░ db.Exec ()" рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдФрд░ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдареАрдХ рдХрд░ рджрд┐рдпрд╛ред рддреЗрдЬреА рд╕реЗ, рдорд╣рд╛рди рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдореБрдЭреЗ рднреА рдпрд╣реА рдорд┐рд▓рд╛ред
рдФрд░, рдореИрдВ "db.Prepare () рдФрд░ db.Exec ()" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:
var db * sql.DB
func getdb () * sql.DB {
db, рдЗрд░реЗрдЯ = sql.Open ("mysql", connArgs)
db.SetMaxIdleConns (100)
рд╡рд╛рдкрд╕реА db
}
func foo (db * sql.DB) {
рдХреБрдЫ рдХрд░реЛ .....
рд╕реНрдорд┐рдВрдЯ, рдЗрд░реЗрдЯ: = db.Prepare (....)
defer smint.Close ()
smint.Exec (....)
}
рджреБрд░реНрдЧрдВрдз рдореБрдЦреНрдп () {
рдлрдВрдХ () {
db = get_db ()
defer db.Close ()
рдлреВ (рдбреАрдмреА)
} ()
}
1.3 рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ
----- рдореВрд▓ рд╕рдВрджреЗрд╢ -----
рдкреНрд░реЗрд╖рдХ: liutaihua рд╕реВрдЪрдирд╛рдПрдВ @github.com
рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛: go-sql-driver / mysql [email protected]
рд╡рд┐рд╖рдп: рдкреБрди: [mysql] рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди (# резрезрез)
рджрд┐рдирд╛рдВрдХ: 15:43, 16 рдЬреБрд▓рд╛рдИ, 2014
рдФрд░ ... рдЖрдк рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧреЛрд░реЛрдЗрди рдХреНрдпреЛрдВ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ?
рдпрджрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ, рддреЛ рдореБрдЦреНрдп рднрд╛рдЧ (рдФрд░ рд╢рд╛рдпрдж рд╣реЛрдЧрд╛) рдЧреЛрд░реЛрдЗрди рдЪрд▓рд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдЖрдкрдХрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред
рдмрд╕ go func(){
рдФрд░ }()
рдирд┐рдХрд╛рд▓реЗрдВред рдЖрдк рдмреЗрд╣рддрд░ рд░рд╣реЗрдВрдЧреЗред
рдореЗрд░реЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП рдЦреЗрдж рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдб:
func socke_server () {
рдХреЗ рд▓рд┐рдпреЗ {
// accept_something_from_socket рдЬреИрд╕рд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ
рдЬрд╛рдУ рдлрдВрдХ (some_receive) {
db = get_db ()
defer db.Close ()
рдлреВ (рдбреАрдмреА)
}
}
}
рджреБрд░реНрдЧрдВрдз рдореБрдЦреНрдп () {
socke_server ()
}
рд▓реЗрдХрд┐рди, рдЕрдм, рдореИрдВ рдпреВрдирд┐рдХреНрд╕ рдбреЛрдореЗрди рдкреНрд░реЛрдЯреЛрдХреЙрд▓ (' рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛: pwd @ unix (/tmp/mysql.sock)/') рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ рддрдп рд╣реИред
рдзрдиреНрдпрд╡рд╛рдж рдЙрддреНрддрд░
рдЖрдкрдХреЛ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рддреЛ - рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдзреАрдорд╛ рд╣реИред
рдореБрдЦреНрдп рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░-рдкрд╛рд╢ рд░рдЦреЛред
рдЧреЛрд░реЛрдЗрди рдХреЛ рдПрдХ рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдмрджрд▓реЗрдВред
рдЕрдкрдирд╛ get_db рдХреЛрдб рдЕрдкрдиреЗ рдореБрдЦреНрдп рдФрд░ defer.boser рдХреЗ рд╢реАрд░реНрд╖ рдореЗрдВ рд░рдЦреЗрдВ, рд╡рд╣рд╛рдВ рднреА (рдФрд░ рдХреЗрд╡рд▓ рд╡рд╣рд╛рдВ)ред
рдЗрд╕ рддрд░рд╣ db рдХреЛ рдирд╛ рдЦреЛрд▓реЗрдВ рдФрд░ рдмрдВрдж рдХрд░реЗрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ:
func handleConnection(db *sql.DB, args...interface{}) {
// do someting.....
// db.Exec("STATEMENT", args...)
}
func main() {
db, err := sql.Open("mysql", connArgs)
if err != nil {
panic(err)
}
db.SetMaxIdleConns(100)
defer db.Close()
for {
// accept connections and pass relevant stuff to handleConnection
go handleConnection(db, nil)
}
}
рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдорд┐рд▓ рдЧрдпрд╛ред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╡рд┐рдХрд▓реНрдк 1: рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрдЧрд╛рдорд┐рддрд┐
рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╡рд░реНрддреА рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдорд╡рд░реНрддреА рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ / рдПрд╕рдХреНрдпреВрдПрд▓ рдкреИрдХреЗрдЬ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрд╡рд░реБрджреНрдз-рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ / рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрджреНрдпрддрди рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдВрдЧреЗред
рд╡рд┐рдХрд▓реНрдк 2: рд░рд┐рд╕рд╛рд╡ рдХрдиреЗрдХреНрд╢рди
рд╕рдВрднрд╡рдд: рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд┐рд░реНрдл рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рд▓реАрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк
rows
db.Query
рдпрд╛ рд▓реЗрдирджреЗрди рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ ( рдбреЗрдЯрд╛рдмреЗрд╕ / sql рдХреЗ tx api рдореЗрдВ )редрдореЗрд░реА рд╕рд╛рдорд╛рдиреНрдп рд╕рд▓рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ
db.Exec
рдпрджрд┐ рдЖрдк рдПрдХ рд▓реМрдЯреА рд╣реБрдИ рдкрдВрдХреНрддрд┐ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЖрдкScan
рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрдиреЗрдХреНрд╢рди рдореБрдлреНрдд рд╣реИредdb.QueryRow
рдпрджрд┐ рдЖрдк рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЬрдВрдЬреАрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрдиреЗрдХреНрд╢рди рд▓реАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗdb.Query
рдпрджрд┐ рдЖрдк рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛rows.Next
рд▓реВрдкрд┐рдВрдЧ) рдпрд╛rows.Close
рдХреЙрд▓ рдХрд░реЗрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,rows.Close
рдХреЙрд▓ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рддреНрд░реБрдЯрд┐-рдорд╛рдорд▓реЛрдВ рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред