为了账号安全,请及时绑定邮箱和手机立即绑定

Gosqlite(golang)中出现奇怪的sqlite错误

Gosqlite(golang)中出现奇怪的sqlite错误

Go
手掌心 2021-04-30 17:08:27
我遇到了一个奇怪的错误,无法找出问题所在。我使用此功能保存传入的消息:func (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控制台中发送复制粘贴查询,而不会出现问题。有人看到出什么问题了吗?请帮忙!
查看完整描述

1 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

我认为您的问题是"用来分隔字符串文字的,虽然这不是标准的SQL语法,并且sqlite也不支持。引用其手册

字符串常量是通过将字符串括在单引号(')中形成的。可以通过将两个单引号放在一行中来对字符串中的单引号进行编码-如Pascal中那样。不支持使用反斜杠字符进行C样式转义,因为它们不是标准的SQL

因此,显然应该使用

insertsql := fmt.Sprintf(`INSERT INTO mails (sender,subject,text,time) VALUES ('%v', '%v', '%v', %v) ;`, ...)

还要注意,像您一样构造SQL语句是幼稚的,并且容易受到SQL注入攻击的影响。正确的方法是首先创建一个准备好的语句,然后将其参数绑定到实际值,然后执行它。我没有使用Go绑定到sqlite的经验,因此我无法确定它们是否支持我引用的API,但我认为您应该尝试对此进行调查。


查看完整回答
反对 回复 2021-05-10
  • 1 回答
  • 0 关注
  • 304 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信