如何在 SQL 查询中将 URI 作为字符串附加
How to append URI as string in SQL query
看起来很简单,但我做不到。
浏览 domain.com/post/1
时,它应该显示行 id
中的数据,其值 1
.
第 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()
}
部分问题是您将字符串 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=", params["idnumber"])
这应该可以解决我认为您遇到的问题。但是,在您实际使用您遇到的实际问题更新您的问题之前,我不会知道。
更新
您在 undefined: params
中遇到的错误是因为您在范围内没有 params 对象。
我建议阅读马提尼如何在消除争论方面发挥作用。 https://github.com/go-martini/martini#routing
我认为问题在于您在字符串文字查询中使用了变量名称,而您希望它的值存在。
尝试改变这个;
rows, err := db.Query(`SELECT title, author, description FROM books WHERE id = params["idnumber"]`)
至;
rows, err := db.Query("SELECT title, author, description FROM books WHERE id =", params["idnumber"])
除此之外你可能还有其他问题,但鉴于你没有正确形成查询,我不希望你得到你想要的结果。
看起来很简单,但我做不到。
浏览 domain.com/post/1
时,它应该显示行 id
中的数据,其值 1
.
第 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()
}
部分问题是您将字符串 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=", params["idnumber"])
这应该可以解决我认为您遇到的问题。但是,在您实际使用您遇到的实际问题更新您的问题之前,我不会知道。
更新
您在 undefined: params
中遇到的错误是因为您在范围内没有 params 对象。
我建议阅读马提尼如何在消除争论方面发挥作用。 https://github.com/go-martini/martini#routing
我认为问题在于您在字符串文字查询中使用了变量名称,而您希望它的值存在。
尝试改变这个;
rows, err := db.Query(`SELECT title, author, description FROM books WHERE id = params["idnumber"]`)
至;
rows, err := db.Query("SELECT title, author, description FROM books WHERE id =", params["idnumber"])
除此之外你可能还有其他问题,但鉴于你没有正确形成查询,我不希望你得到你想要的结果。