Mysql: рдмрд╣реБрдд рд╕рд╛рд░реЗ рдХрдиреЗрдХреНрд╢рди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 23 рдЬреБрд▓ре░ 2013  ┬╖  9рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: go-sql-driver/mysql

рдореБрдЭреЗ 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" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдХреБрдЫ рдирд╣реАрдВред

question working as intended

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

рд╡рд┐рдХрд▓реНрдк 1: рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрдЧрд╛рдорд┐рддрд┐

рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╡рд░реНрддреА рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдорд╡рд░реНрддреА рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ / рдПрд╕рдХреНрдпреВрдПрд▓ рдкреИрдХреЗрдЬ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрд╡рд░реБрджреНрдз-рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ / рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрджреНрдпрддрди рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдВрдЧреЗред

рд╡рд┐рдХрд▓реНрдк 2: рд░рд┐рд╕рд╛рд╡ рдХрдиреЗрдХреНрд╢рди

рд╕рдВрднрд╡рдд: рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд┐рд░реНрдл рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рд▓реАрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк rows db.Query рдпрд╛ рд▓реЗрдирджреЗрди рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВ ( рдбреЗрдЯрд╛рдмреЗрд╕ / sql рдХреЗ tx api рдореЗрдВ )ред

рдореЗрд░реА рд╕рд╛рдорд╛рдиреНрдп рд╕рд▓рд╛рд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ

  • db.Exec рдпрджрд┐ рдЖрдк рдПрдХ рд▓реМрдЯреА рд╣реБрдИ рдкрдВрдХреНрддрд┐ рдХреА рдЙрдореНрдореАрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ (рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдЖрдк Scan рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ)ред рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрдиреЗрдХреНрд╢рди рдореБрдлреНрдд рд╣реИред
  • db.QueryRow рдпрджрд┐ рдЖрдк рдПрдХ рдкрдВрдХреНрддрд┐ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЬрдВрдЬреАрд░ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрдиреЗрдХреНрд╢рди рд▓реАрдХ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ
  • db.Query рдпрджрд┐ рдЖрдк рдХрдИ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ rows.Next рд▓реВрдкрд┐рдВрдЧ) рдпрд╛ rows.Close рдХреЙрд▓ рдХрд░реЗрдВред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, rows.Close рдХреЙрд▓ рдХреЛ рд╕реНрдердЧрд┐рдд рдХрд░рдирд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рддреНрд░реБрдЯрд┐-рдорд╛рдорд▓реЛрдВ рдЖрджрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред

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

рдХреГрдкрдпрд╛ рдпрд╣рд╛рдВ рджреЗрдЦреЗрдВ: https://github.com/VividCortex/go-database-sql-tutorial

ред

рд╡рд┐рдХрд▓реНрдк 1: рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдВрдЧрд╛рдорд┐рддрд┐

рдЖрдкрдХреЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕рдорд╡рд░реНрддреА рдбреЗрдЯрд╛рдмреЗрд╕ рдПрдХреНрд╕реЗрд╕ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЖрдкрдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╕рдорд╡рд░реНрддреА рдХрдиреЗрдХреНрд╢рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬрдм рддрдХ рдХрд┐ рдбреЗрдЯрд╛рдмреЗрд╕ / рдПрд╕рдХреНрдпреВрдПрд▓ рдкреИрдХреЗрдЬ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрд╡рд░реБрджреНрдз-рддрдВрддреНрд░ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдХреИрд╢рд┐рдВрдЧ / рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрджреНрдпрддрди рдмреЗрд╣рддрд░ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдВрдЧреЗред

рд╡рд┐рдХрд▓реНрдк 2: рд░рд┐рд╕рд╛рд╡ рдХрдиреЗрдХреНрд╢рди

рд╕рдВрднрд╡рдд: рдЖрдкрдХрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╕рд┐рд░реНрдл рдбреЗрдЯрд╛рдмреЗрд╕ рдХрдиреЗрдХреНрд╢рди рд▓реАрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рддрдм рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдЖрдк 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)
    }
}

рдзрдиреНрдпрд╡рд╛рдж, рдореБрдЭреЗ рдорд┐рд▓ рдЧрдпрд╛ред

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

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

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

lunemec picture lunemec  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

julienschmidt picture julienschmidt  ┬╖  7рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

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

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