我遇到了一個奇怪的錯誤,無法找出問題所在。我使用此功能保存?zhèn)魅氲南ⅲ篺unc (mdb *MailDB) SaveMail(mail *Mail){ conn, err := sqlite.Open("maildb.db") if err != nil { log.Print("Unable to open the database: ", err) return } defer conn.Close() insertsql := fmt.Sprintf(`INSERT INTO mails (sender,subject,text,time) VALUES ("%v", "%v", "%v", %v) ;`, mail.Sender,mail.Subject,mail.Text,time.Now().Unix()) err = conn.Exec(insertsql) if err!=nil { log.Print("maildb insert fail @exec: ",err) log.Print(insertsql) return }}我收到此錯誤:2012/05/09 10:10:20 maildb insert fail @exec: SQL error or missing database: unrecognized token: """2012/05/09 10:10:20 INSERT INTO mails (sender,subject,text,time) VALUES ("wLrOBizTcmS1MlqeXydUK9U6YJQ=", "abc", "321", 1336551020) ;(在321之后是'\ n',我不知道為什么在這里省略了它)奇怪的是,我可以在sqlite控制臺中發(fā)送復制粘貼查詢,而不會出現(xiàn)問題。有人看到出什么問題了嗎?請幫忙!
1 回答

米琪卡哇伊
TA貢獻1998條經(jīng)驗 獲得超6個贊
我認為您的問題是"
用來分隔字符串文字的,雖然這不是標準的SQL語法,并且sqlite也不支持。引用其手冊:
字符串常量是通過將字符串括在單引號(')中形成的。可以通過將兩個單引號放在一行中來對字符串中的單引號進行編碼-如Pascal中那樣。不支持使用反斜杠字符進行C樣式轉(zhuǎn)義,因為它們不是標準的SQL
因此,顯然應該使用
insertsql := fmt.Sprintf(`INSERT INTO mails (sender,subject,text,time) VALUES ('%v', '%v', '%v', %v) ;`, ...)
還要注意,像您一樣構(gòu)造SQL語句是幼稚的,并且容易受到SQL注入攻擊的影響。正確的方法是首先創(chuàng)建一個準備好的語句,然后將其參數(shù)綁定到實際值,然后執(zhí)行它。我沒有使用Go綁定到sqlite的經(jīng)驗,因此我無法確定它們是否支持我引用的API,但我認為您應該嘗試對此進行調(diào)查。
- 1 回答
- 0 關(guān)注
- 332 瀏覽
添加回答
舉報
0/150
提交
取消