2012-05-09 4 views
0

이상한 오류가있어서 잘못된 점을 알 수 없습니다. 나는이 오류가gosqlite (golang)에 이상한 sqlite 오류가 발생했습니다.

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을'내가이 여기 ommited 이유를 잘 모릅니다을 후)

이상한 점은 문제없이 sqlite 콘솔에서 copy'n'pasted 쿼리를 보낼 수 있다는 것입니다.

누군가가 어떻게 잘못되고있는 걸 보나요? 도와주세요!

+0

\ n 또는 메일 필드 중 하나의 다른 문자에 문제가 있습니까? 이 경우 준비된 문장을 사용하는 것이 해결책이 될 수 있습니다. –

답변

2

나는이 문제가 표준 SQL 구문이 아니고 sqlite에서도 지원되지 않는 한 "을 사용하여 문자열 리터럴을 구분한다고 생각합니다. 는 its manual을 인용하기 : 그래서 명백한 수정

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

를 사용한다

A string constant is formed by enclosing the string in single quotes ('). A single quote within the string can be encoded by putting two single quotes in a row - as in Pascal. C-style escapes using the backslash character are not supported because they are not standard SQL

또한 당신이 같은 SQL 문을 구성하는 것은 순진하고 SQL injection attacks의 적용을받습니다 있습니다. 적절한 방법은 먼저 create a prepared statement, 그 다음 bind its parameters to actual values으로 실행 한 다음 실행하는 것입니다. 내가 sqlite에 Go 바인딩에 대한 경험이 없기 때문에 언급 한 API를 지원하는지 알 수 없지만이 문제를 조사해야한다고 생각합니다.

+0

singlequotes를 사용하면 문제가 해결되지 않습니다. 나는 sqlite.prepare를 사용하는 방법을 탐색 할 것이다. –

관련 문제