実現したいこと
MySQLのarticlesテーブルから一意の情報のid,titleの情報を取得したいです。
ルーティングはchiを使用しています。
MySQLはDockerで構築しています。
前提
Postmanでhttp://localhost:8080/article/1のように
フロントからリクエストしたidによってデータベースから情報を取得したいです。
発生している問題・エラーメッセージ
Error querying database: sql: no rows in result set
該当のソースコード
データベースの接続はroutes.goファイルに書いてます。 unc Connect() *sql.DB { user := "webuser" password := "webpass" host := "localhost" port := "3307" database_name := "go_mysql8_development" dbconf := user + ":" + password + "@tcp(" + host + ":" + port + ")/" + database_name + "?charset=utf8mb4" db, err := sql.Open("mysql", dbconf) if err != nil { fmt.Println(err.Error()) } return db }
handlers.goの中には package main import ( "encoding/json" "fmt" "io" "log" "react-go-mybackend/database" "react-go-mybackend/internal/models" "strconv" // "log" "database/sql" "net/http" "github.com/go-chi/chi" _ "github.com/go-sql-driver/mysql" ) type Article struct { Id int `json:"id"` Title string `json:"title"` } func (app *application) GetArticleByID(w http.ResponseWriter, r *http.Request) { userID := chi.URLParam(r, "id") ids, _ := strconv.Atoi(userID) db := database.Connect() defer db.Close() var id int var title string err := db.QueryRow("SELECT id, title FROM articles WHERE id = ?", ids).Scan(&id, &title) if err != nil { fmt.Fprintf(w, "Error querying database: %s", err.Error()) return } article := map[string]interface{}{ "id": id, "title": title, } articleJSON, err := json.Marshal(article) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } w.Header().Set("Content-Type", "application/json") w.WriteHeader(http.StatusOK) w.Write(articleJSON) }
main.goには package main import ( "fmt" "log" "net/http" "react-go-mybackend/database" ) func init() { db := database.Connect() defer db.Close() err := db.Ping() if err != nil { fmt.Println("データベース接続失敗") return } else { fmt.Println("データベース接続成功") } } type application struct { Domain string } const port = 8080 func main() { var app application app.Domain = "example.com" err := http.ListenAndServe(fmt.Sprintf(":%d", port), app.routes()) if err != nil { log.Fatal(err) } }
mysql> select * from articles; +----+-----------+ | id | title | +----+-----------+ | 1 | みかみ | | 2 | くさの | | 3 | やまだ | +----+-----------+ 3 rows in set (0.00 sec) mysql> select * from articles where id = 1; +----+-----------+ | id | title | +----+-----------+ | 1 | みかみ | +----+-----------+ 1 row in set (0.00 sec)
### 試したこと デバッグしたがID: 0になってしまう。 idStr := chi.URLParam(r, "id") fmt.Printf("ID: %s\n", idStr) chi.URLParamがうまく機能していない可能性があり idStr := r.URL.Query().Get("id") fmt.Printf("ID: %s\n", idStr) ではID: がからになってしまいます。 どうか皆様お力をお貸しくださいm(_ _)m よろしくお願いいたします。
あなたの回答
tips
プレビュー