drcmue4619 2015-09-05 17:24
浏览 101
已采纳

UPDATE SQL命令不适用于GO语言

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

See the updateDate method for details.

package main

import (
    "database/sql"
    "fmt"
    "log"

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

type ConnData struct {
    // para usar conexão via socket veja '/etc/mysql/my.cnf'
    // para usar conexão via tcp confira a porta com 'ps -ef | grep mysqld'
    dbuser, dbpasswd, dbname, tcp, socket string
}

var myConnData = ConnData{dbuser: "soma", dbpasswd: "secret1000",
    dbname: "test",
    tcp:    "tcp(127.0.0.1:3307)",
    socket: "unix(/tmp/mysql.sock)"}

// CREATE TABLE userinfo
// (
//     uid serial NOT NULL,
//     username character varying(20) NOT NULL,
//     depto character varying(10)  NULL,
//     Created date,
//     CONSTRAINT userinfo_pkey PRIMARY KEY (uid)
// )
func main() {
    _ = ConnectToMySQLAndRunCmd(myConnData).(string)
}
func ConnectToMySQLAndRunCmd(connData ConnData) interface{} {
    myConnStr := connData.dbuser + ":" + connData.dbpasswd +
        "@" + connData.tcp + "/" + connData.dbname
    log.Printf("Connecting to MySQL Server using %s
", myConnStr)
    db, err := sql.Open("mysql", myConnStr)
    // myConnStr := connData.dbuser + ":" + connData.dbpasswd +
    //  "@" + connData.tcp + "/" + connData.dbname

    defer db.Close()
    checkErr(err)
    // Open doesn't open a connection. Validate DSN data:
    err = db.Ping()
    checkErr(err)
    // Limpando a tabela
    _, err = db.Exec("DELETE FROM userinfo")
    checkErr(err)
    // Consultando
    selectAll(db)
    // Inserindo
    stmt, err := db.Prepare("INSERT INTO userinfo (username, depto, created) VALUES(?,?,?)")
    // db.Prepare("INSERT INTO users(name) VALUES(?)")
    checkErr(err)
    res, err := stmt.Exec("Pedro", "TI", "2015-09-01")
    checkErr(err)
    lastId, err := res.LastInsertId()
    checkErr(err)
    rowCnt, err := res.RowsAffected()
    checkErr(err)
    log.Printf("ID = %d, affected = %d
", lastId, rowCnt)
    // Verificando
    selectAll(db)
    // Atualizando
    updateDate(db, lastId)
    // Verificando Novamente
    selectAll(db)
    return "OK"
}

func selectAll(mydb *sql.DB) {
    // Consultando todos
    var (
        id    int
        name  string
        depto string
        date  string
    )
    rows, err := mydb.Query("select uid, username, depto, created from userinfo")
    checkErr(err)
    defer rows.Close()
    for rows.Next() {
        err := rows.Scan(&id, &name, &depto, &date)
        checkErr(err)
        log.Println(id, name, depto, date)
    }
    err = rows.Err()
    checkErr(err)
}

func updateDate(mydb *sql.DB, lastId int64) {
    // Atualizando a data
    tx, err := mydb.Begin()
    checkErr(err)
    //...
    cmd := "UPDATE userinfo SET created = ? WHERE uid = ?"
    updateDate, err := tx.Prepare(cmd)
    checkErr(err)
    //...
    log.Println("•••• Updating record", lastId)
    res, err := updateDate.Exec(lastId, "2015-09-02")
    checkErr(err)
    // log.Println("•••• >>> ", res)
    updateDate.Close()
    err = tx.Commit()
    checkErr(err)
    affect, err := res.RowsAffected()
    checkErr(err)

    fmt.Println("Records affected", affect)
}

func checkErr(err error) {
    if err != nil {
        log.Fatal(err)
        panic(err)
    }
}

What is going wrong ?

See below the result when I run the main programa.

$ ./main
2015/09/05 14:04:34 Connecting to MySQL Server using soma:soma@tcp(127.0.0.1:3307)/test
2015/09/05 14:04:34 ID = 3, affected = 1
2015/09/05 14:04:34 3 Pedro TI 2015-09-01
2015/09/05 14:04:34 •••• Updating record 3
Records affected 0
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条回答 默认 最新

  • douda5706 2015-09-05 17:29
    关注

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

    cmd := "UPDATE userinfo SET created = ? WHERE uid = ?"
    res, err := updateDate.Exec(lastId, "2015-09-02")
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 运筹学中在线排序的时间在线排序的在线LPT算法
  • ¥30 求一段fortran代码用IVF编译运行的结果
  • ¥15 深度学习根据CNN网络模型,搭建BP模型并训练MNIST数据集
  • ¥15 lammps拉伸应力应变曲线分析
  • ¥15 C++ 头文件/宏冲突问题解决
  • ¥15 用comsol模拟大气湍流通过底部加热(温度不同)的腔体
  • ¥50 安卓adb backup备份子用户应用数据失败
  • ¥20 有人能用聚类分析帮我分析一下文本内容嘛
  • ¥15 请问Lammps做复合材料拉伸模拟,应力应变曲线问题
  • ¥30 python代码,帮调试,帮帮忙吧