GoLang mysql执行不起作用

时间:2015-06-04 20:25:51

标签: mysql go

所以我试图使用mysql驱动程序将数据插入数据库。

具体来说,我正在使用这个 -

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

这是我的代码

func main() {

db, err := sql.Open("mysql", "psanker:123@/education_data")
err = db.Ping()

if err != nil {
    fmt.Println("Failed to prepare connection to database")
    log.Fatal("Error:", err.Error())
}

defer db.Close()


    content, err := ioutil.ReadFile("activities.csv")

    lines := strings.Split(string(content), "\r")

    //only work so long as I have one district
    rows, err := db.Query("SELECT id FROM districts")
    var districtId int
    defer rows.Close()

    for rows.Next() {
        err := rows.Scan(&districtId)
        check(err)
    }


    for i, line := range lines {
        if i > 1 {
            splitStr := strings.Split(line, ",")
            var activityCode string

            if strings.Contains(splitStr[0], "-") {
                //this is an activity
                activityCode = splitStr[0]
                stmt1, _ := db.Prepare("INSERT INTO activities(code) VALUES(?)")
                stmt2, _ := db.Prepare("INSERT INTO activities(name) VALUES(?)")
                res, _ := stmt1.Exec(splitStr[0])
                stmt2.Exec(splitStr[1])
            } else {
                //this is a sub activity
                stmt1, _ := db.Prepare("INSERT INTO sub_activities(code) VALUES(?)")
                stmt2, _ := db.Prepare("INSERT INTO sub_activities(name) VALUES(?)")
                stmt1.Exec(splitStr[0])
                stmt2.Exec(splitStr[1])
                if activityCode != "" {
                    rows, _ := db.Query("SELECT id from activities where code = ?", activityCode)
                    var activityId int
                    for rows.Next() {
                        err := rows.Scan(&activityId)
                        check(err)
                        stmt3, err := db.Prepare("INSERT INTO sub_activities(activity_id) VALUES(?)")
                        stmt3.Exec(activityId)
                    }
                }
                rows, _ := db.Query("SELECT id from sub_activities where code= ?", splitStr[0])
                var sub_activityId int
                for rows.Next() {
                    err := rows.Scan(&sub_activityId)
                    check(err)
                    stmt5, _ := db.Prepare("INSERT INTO sub_activity_expenditure(district_id) VALUES(?)")
                    stmt6, _ := db.Prepare("INSERT INTO sub_activity_expenditure(sub_activity_id) VALUES(?)")
                    stmt7, _ := db.Prepare("INSERT INTO sub_activity_expenditure(expenditure) VALUES(?)")
                    stmt5.Exec(districtId)
                    stmt6.Exec(sub_activityId)
                    stmt7.Exec(splitStr[2])
                }
            }
        }
    }
}

当我检查我的sql数据库时,表中没有插入行。我想我正在访问正确的数据库,因为从区获取id的初始查询返回1,这是正确的。

发生了什么?

修改

通过这样做我确认了我在正确的数据库中

rows, err = db.Query("SELECT DATABASE();")
var test string

for rows.Next() {
    rows.Scan(&test)
    fmt.Println(test)
}

打印出education_data

1 个答案:

答案 0 :(得分:1)

因为你试图插入一个表(至少在聊天中)提醒我你的列是非空的,并且当你实际创建两个时你真的打算创建一行......它失败了在stmt1和stmt2 cuz非可空列上没有给出参数来替换插入成功所需的所有必要数据。

专注于stmt1和stmt2的1行创建(将它们组合成单个stmt1以使用2个参数执行)。

确保字符串包含单引号