2015-04-22 100 views
-1

看起来很简单,但无法实现。 当浏览domain.com/post/1时,它应显示来自行id的数据,其值为1如何在SQL查询中将URI附加为字符串

id是整数(int4)。

下面的代码,这是行不通的:

package main 

import "fmt" 
import "github.com/go-martini/martini" 
import "net/http" 
import "database/sql" 
import _ "github.com/lib/pq" 

func SetupDB() *sql.DB { 
    db, err := sql.Open("postgres", "user=postgres password=apassword dbname=lesson4 sslmode=disable") 
    PanicIf(err) 
    return db 
} 

func PanicIf(err error) { 
    if err != nil { 
    panic(err) 
    } 
} 

func main() { 
    m := martini.Classic() 
    m.Map(SetupDB()) 

    m.Get("/post/:idnumber", func(rw http.ResponseWriter, r *http.Request, db *sql.DB) { 

    rows, err := db.Query(`SELECT title, author, description FROM books WHERE id = params["idnumber"]`) 
    PanicIf(err) 
    defer rows.Close() 

    var title, author, description string 
    for rows.Next() { 
     err:= rows.Scan(&title, &author, &description) 
     PanicIf(err) 
     fmt.Fprintf(rw, "Title: %s\nAuthor: %s\nDescription: %s\n\n", 
     title, author, description) 
    } 

    }) 

    m.Run() 
} 
+0

当你说不工作你是什么意思?它不是在sql中找到行吗? –

+0

我总是得不到它,并给出错误。尝试过不同的方式。我只是不知道 – apasajja

+0

我忘记了有关参数。 – apasajja

回答

1

您的问题的部分原因是,你使用的字符串作为params["idnumber"] SQL查询的一部分

db.Query(`SELECT title, author, description FROM books WHERE id = params["idnumber"]`) 

那会看对于id等于params["idnumber"]字符串的书。

你需要做的是根据http://golang.org/pkg/database/sql/#DB.Query

在这种情况下使用占位符和参数查询应该是

db.Query("SELECT title, author, description FROM books WHERE id=$1", params["idnumber"]) 

这应该解决,我认为您遇到的问题。然而,直到你实际上更新你的问题与你遇到的实际问题,我不会知道。

更新

你与undefined: params得到的错误是因为你没有在范围params对象。

我建议阅读马丁尼如何工作的方式获取参数的路线。 https://github.com/go-martini/martini#routing

+0

第27行出现错误:undefined:params – apasajja

+0

我忘了添加'params martini.Params'。您的代码现在可用。谢谢 – apasajja

1

我认为问题在于您在字符串文字查询中使用了变量名称,而您希望它的值存在。

试着改变它;

rows, err := db.Query(`SELECT title, author, description FROM books WHERE id = params["idnumber"]`) 

to;

rows, err := db.Query("SELECT title, author, description FROM books WHERE id =$1", params["idnumber"]) 

你可能还有其他问题,但鉴于你没有正确形成查询我不希望你找回你想要的结果。

+0

也有像莱奥科雷亚答案的错误。第27行的错误:undefined:params – apasajja

+0

@apasajja是的,好吧,你只是在没有声明任何地方的情况下使用参数。什么是'm'?您正在查找请求url.Values,它是关键值对的字典,您需要在将其传递到您的查询之前将其放入所需的字符串格式。 – evanmcdonnal

+0

是的。我忘了添加'params martini.Params'。不幸的是,您的代码在添加params声明后不起作用,而Leo Correa代码正常工作。 'm'是马丁尼。是的,将URI附加为部分数据库查询(SQL)。 – apasajja

相关问题