UPDATE SQL命令在GO语言中无法正常工作。

huangapple go评论117阅读模式
英文:

The UPDATE SQL command doesn't work with GO language

问题

在下面的示例中,UPDATE命令无法正常工作。为什么?

详见updateDate方法的细节。

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "log"
  6. _ "github.com/go-sql-driver/mysql"
  7. )
  8. type ConnData struct {
  9. // para usar conexão via socket veja '/etc/mysql/my.cnf'
  10. // para usar conexão via tcp confira a porta com 'ps -ef | grep mysqld'
  11. dbuser, dbpasswd, dbname, tcp, socket string
  12. }
  13. var myConnData = ConnData{dbuser: "soma", dbpasswd: "secret1000",
  14. dbname: "test",
  15. tcp: "tcp(127.0.0.1:3307)",
  16. socket: "unix(/tmp/mysql.sock)"}
  17. // CREATE TABLE userinfo
  18. // (
  19. // uid serial NOT NULL,
  20. // username character varying(20) NOT NULL,
  21. // depto character varying(10) NULL,
  22. // Created date,
  23. // CONSTRAINT userinfo_pkey PRIMARY KEY (uid)
  24. // )
  25. func main() {
  26. _ = ConnectToMySQLAndRunCmd(myConnData).(string)
  27. }
  28. func ConnectToMySQLAndRunCmd(connData ConnData) interface{} {
  29. myConnStr := connData.dbuser + ":" + connData.dbpasswd +
  30. "@" + connData.tcp + "/" + connData.dbname
  31. log.Printf("Connecting to MySQL Server using %s\n", myConnStr)
  32. db, err := sql.Open("mysql", myConnStr)
  33. defer db.Close()
  34. checkErr(err)
  35. // Open doesn't open a connection. Validate DSN data:
  36. err = db.Ping()
  37. checkErr(err)
  38. // Limpando a tabela
  39. _, err = db.Exec("DELETE FROM userinfo")
  40. checkErr(err)
  41. // Consultando
  42. selectAll(db)
  43. // Inserindo
  44. stmt, err := db.Prepare("INSERT INTO userinfo (username, depto, created) VALUES(?,?,?)")
  45. checkErr(err)
  46. res, err := stmt.Exec("Pedro", "TI", "2015-09-01")
  47. checkErr(err)
  48. lastId, err := res.LastInsertId()
  49. checkErr(err)
  50. rowCnt, err := res.RowsAffected()
  51. checkErr(err)
  52. log.Printf("ID = %d, affected = %d\n", lastId, rowCnt)
  53. // Verificando
  54. selectAll(db)
  55. // Atualizando
  56. updateDate(db, lastId)
  57. // Verificando Novamente
  58. selectAll(db)
  59. return "OK"
  60. }
  61. func selectAll(mydb *sql.DB) {
  62. // Consultando todos
  63. var (
  64. id int
  65. name string
  66. depto string
  67. date string
  68. )
  69. rows, err := mydb.Query("select uid, username, depto, created from userinfo")
  70. checkErr(err)
  71. defer rows.Close()
  72. for rows.Next() {
  73. err := rows.Scan(&id, &name, &depto, &date)
  74. checkErr(err)
  75. log.Println(id, name, depto, date)
  76. }
  77. err = rows.Err()
  78. checkErr(err)
  79. }
  80. func updateDate(mydb *sql.DB, lastId int64) {
  81. // Atualizando a data
  82. tx, err := mydb.Begin()
  83. checkErr(err)
  84. //...
  85. cmd := "UPDATE userinfo SET created = ? WHERE uid = ?"
  86. updateDate, err := tx.Prepare(cmd)
  87. checkErr(err)
  88. //...
  89. log.Println("•••• Updating record", lastId)
  90. res, err := updateDate.Exec(lastId, "2015-09-02")
  91. checkErr(err)
  92. // log.Println("•••• >>> ", res)
  93. updateDate.Close()
  94. err = tx.Commit()
  95. checkErr(err)
  96. affect, err := res.RowsAffected()
  97. checkErr(err)
  98. fmt.Println("Records affected", affect)
  99. }
  100. func checkErr(err error) {
  101. if err != nil {
  102. log.Fatal(err)
  103. panic(err)
  104. }
  105. }

出了什么问题?

当我运行主程序时,下面是结果:

  1. $ ./main
  2. 2015/09/05 14:04:34 Connecting to MySQL Server using soma:soma@tcp(127.0.0.1:3307)/test
  3. 2015/09/05 14:04:34 ID = 3, affected = 1
  4. 2015/09/05 14:04:34 3 Pedro TI 2015-09-01
  5. 2015/09/05 14:04:34 •••• Updating record 3
  6. Records affected 0
  7. 2015/09/05 14:04:34 3 Pedro TI 2015-09-01

我使用go build -a -installsuffix cgo -o main .来构建主程序。

英文:

In this example below the UPDATE command doesn't work. Why ?

See the updateDate method for details.

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "log"
  6. _ "github.com/go-sql-driver/mysql"
  7. )
  8. type ConnData struct {
  9. // para usar conexão via socket veja '/etc/mysql/my.cnf'
  10. // para usar conexão via tcp confira a porta com 'ps -ef | grep mysqld'
  11. dbuser, dbpasswd, dbname, tcp, socket string
  12. }
  13. var myConnData = ConnData{dbuser: "soma", dbpasswd: "secret1000",
  14. dbname: "test",
  15. tcp: "tcp(127.0.0.1:3307)",
  16. socket: "unix(/tmp/mysql.sock)"}
  17. // CREATE TABLE userinfo
  18. // (
  19. // uid serial NOT NULL,
  20. // username character varying(20) NOT NULL,
  21. // depto character varying(10) NULL,
  22. // Created date,
  23. // CONSTRAINT userinfo_pkey PRIMARY KEY (uid)
  24. // )
  25. func main() {
  26. _ = ConnectToMySQLAndRunCmd(myConnData).(string)
  27. }
  28. func ConnectToMySQLAndRunCmd(connData ConnData) interface{} {
  29. myConnStr := connData.dbuser + ":" + connData.dbpasswd +
  30. "@" + connData.tcp + "/" + connData.dbname
  31. log.Printf("Connecting to MySQL Server using %s\n", myConnStr)
  32. db, err := sql.Open("mysql", myConnStr)
  33. // myConnStr := connData.dbuser + ":" + connData.dbpasswd +
  34. // "@" + connData.tcp + "/" + connData.dbname
  35. defer db.Close()
  36. checkErr(err)
  37. // Open doesn't open a connection. Validate DSN data:
  38. err = db.Ping()
  39. checkErr(err)
  40. // Limpando a tabela
  41. _, err = db.Exec("DELETE FROM userinfo")
  42. checkErr(err)
  43. // Consultando
  44. selectAll(db)
  45. // Inserindo
  46. stmt, err := db.Prepare("INSERT INTO userinfo (username, depto, created) VALUES(?,?,?)")
  47. // db.Prepare("INSERT INTO users(name) VALUES(?)")
  48. checkErr(err)
  49. res, err := stmt.Exec("Pedro", "TI", "2015-09-01")
  50. checkErr(err)
  51. lastId, err := res.LastInsertId()
  52. checkErr(err)
  53. rowCnt, err := res.RowsAffected()
  54. checkErr(err)
  55. log.Printf("ID = %d, affected = %d\n", lastId, rowCnt)
  56. // Verificando
  57. selectAll(db)
  58. // Atualizando
  59. updateDate(db, lastId)
  60. // Verificando Novamente
  61. selectAll(db)
  62. return "OK"
  63. }
  64. func selectAll(mydb *sql.DB) {
  65. // Consultando todos
  66. var (
  67. id int
  68. name string
  69. depto string
  70. date string
  71. )
  72. rows, err := mydb.Query("select uid, username, depto, created from userinfo")
  73. checkErr(err)
  74. defer rows.Close()
  75. for rows.Next() {
  76. err := rows.Scan(&id, &name, &depto, &date)
  77. checkErr(err)
  78. log.Println(id, name, depto, date)
  79. }
  80. err = rows.Err()
  81. checkErr(err)
  82. }
  83. func updateDate(mydb *sql.DB, lastId int64) {
  84. // Atualizando a data
  85. tx, err := mydb.Begin()
  86. checkErr(err)
  87. //...
  88. cmd := "UPDATE userinfo SET created = ? WHERE uid = ?"
  89. updateDate, err := tx.Prepare(cmd)
  90. checkErr(err)
  91. //...
  92. log.Println("•••• Updating record", lastId)
  93. res, err := updateDate.Exec(lastId, "2015-09-02")
  94. checkErr(err)
  95. // log.Println("•••• >>> ", res)
  96. updateDate.Close()
  97. err = tx.Commit()
  98. checkErr(err)
  99. affect, err := res.RowsAffected()
  100. checkErr(err)
  101. fmt.Println("Records affected", affect)
  102. }
  103. func checkErr(err error) {
  104. if err != nil {
  105. log.Fatal(err)
  106. panic(err)
  107. }
  108. }

What is going wrong ?

See below the result when I run the main programa.

  1. $ ./main
  2. 2015/09/05 14:04:34 Connecting to MySQL Server using soma:soma@tcp(127.0.0.1:3307)/test
  3. 2015/09/05 14:04:34 ID = 3, affected = 1
  4. 2015/09/05 14:04:34 3 Pedro TI 2015-09-01
  5. 2015/09/05 14:04:34 •••• Updating record 3
  6. Records affected 0
  7. 2015/09/05 14:04:34 3 Pedro TI 2015-09-01

I'm using go build -a -installsuffix cgo -o main . to build the main program

答案1

得分: 7

看起来你颠倒了lastId和"2015-09-02"的顺序:

  1. cmd := "UPDATE userinfo SET created = ? WHERE uid = ?"
  2. res, err := updateDate.Exec("2015-09-02", lastId)
英文:

It seems you inverted the order of lastId and "2015-09-02":

  1. cmd := "UPDATE userinfo SET created = ? WHERE uid = ?"
  2. res, err := updateDate.Exec(lastId, "2015-09-02")

huangapple
  • 本文由 发表于 2015年9月6日 01:24:45
  • 转载请务必保留本文链接:https://go.coder-hub.com/32415803.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定