質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

解決済

[Go] echo, GORMを使ったREAT API実装についての質問

tailer
tailer

総合スコア0

Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

1回答

0評価

2クリップ

2410閲覧

投稿2019/09/16 05:50

編集2022/01/12 10:58

Go初心者です。
勉強のために Echo GORMを使ったAPIを作っています。

ただいま usersテーブル に入っているレコードをパラメータで送られたきた id から一つ特定して取得する処理を書いています。 Railsでいう users_contoroller の showアクションのような処理を作りたいです。
しかし、1回目のGETでは成功するクエリが2回目以降失敗してしまい困っています。(下記で説明)
どなたか解決策をご教授頂けますと幸いですm(_ _)m

ディレクトリ構造は以下のようになります

. |-- controllers | `-- users.go |-- db | `-- connect.go |-- main.go `-- models `-- user.go

各ファイルのは以下のようになっています。

↓ main.go

package main import ( "github.com/labstack/echo" "github.com/labstack/echo/middleware" "echo_first/controllers" ) func main() { e := echo.New() e.Use(middleware.Logger()) e.Use(middleware.Recover()) // ルーティング e.GET("user/:id", users_controller.Show()) // サーバー起動 e.Logger.Fatal(e.Start(":3000")) }

↓ models/user.go

package model type User struct { Id int Name string Birth_day int }

↓ db/connect.go

package dbconnect import ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/mysql" "fmt" ) func Connect() *gorm.DB{ db, err := gorm.Open("mysql", "hogeuser:@/hogehoge?charset=utf8&parseTime=True&loc=Local") if err != nil { fmt.Print("データベース接続に失敗しました。") } db.LogMode(true) return db }

↓ conrollers/user.go

package users_controller import ( "github.com/labstack/echo" "net/http" "fmt" "echo_first/models" "echo_first/db" ) func Show() echo.HandlerFunc{ db := dbconnect.Connect() user := new(model.User) return func(c echo.Context) error{ user_id := c.Param("id") result := db.First(&user, "id = ?", user_id) if result.RecordNotFound() { fmt.Println("レコードが見つかりません") } return c.JSON(http.StatusOK, result) } }

サーバーを起動立ち上げ1回目のGETリクエスト user/1では以下のようにデータを取得できます。

[25.45ms] SELECT * FROM `users` WHERE (id = '1') ORDER BY `users`.`id` ASC LIMIT 1 [1 rows affected or returned ]

しかし2回目のGETリクエスト user/2ではSQLがおかしく、データを取得できません。

[29.71ms] SELECT * FROM `users` WHERE `users`.`id` = 1 AND ((id = '2')) ORDER BY `users`.`id` ASC LIMIT 1 [0 rows affected or returned ] レコードが見つかりません

データベースのコネクションの問題なのか、GORMのクエリの問題なのか分からず躓いてしまいました。
データベースのコネクションの問題の場合はどこで db.Closeするのか分かりません...。リクエストの度にデータベースに接続して Closeする??のでしょうか。。
どなたかご教授お願い致します( ; ; )

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

dyoshikawa
dyoshikawa

2019/09/16 06:07

gormだったらgorm\.Open\(\)とすると思うんですがdbconnectとは何ですか? echo特有のwrapperか何かでしょうか。
dyoshikawa
dyoshikawa

2019/09/16 06:09

> REAR API とは何ですか?
dyoshikawa
dyoshikawa

2019/09/16 06:12

> gormだったらgorm\.Open\(\)とすると思うんですがdbconnectとは何ですか? db/connect\.goを見て理解しました。 失礼しました。
tailer
tailer

2019/09/16 06:12

dbへの接続をファイル分割したかったので dbconnectパッケージを作って, その中の Connect関数でgorm\.Open\(\)を使っています。 > REAR API とは何ですか? こちらはtypoでした。ご指摘ありがとうございます

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Echo(フレームワーク)

Echoは、Go言語で作られたフレームワーク。非常に軽量で、小~中規模のアプリ構成を想定した仕様になっています。公式ドキュメントが用意されており、初心者でも始めやすい点が特徴です。

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。