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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Go

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

Q&A

2回答

2875閲覧

Go言語 構造体のスライスが正しく初期化されず、GormでFind出来ない

Sutasyu127

総合スコア11

Go

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

0グッド

0クリップ

投稿2019/06/27 03:29

編集2019/07/10 03:28

Go初心者ですm(_ _"m)
軽いCRUDを実装しようとしています。

前提・実現したいこと

Model構造体をスライス化し、GORMのdb.Find()でusersテーブルを全件取得したいです。

発生している問題・エラーメッセージ

fmt.Printf("%+v\n", Users) の出力結果

[]

該当のソースコード

user.go

Go

1package models 2 3import( 4 "github.com/wcl48/valval" 5 "time" 6 "regexp" 7) 8 9type User struct { 10 Id int64 11 Name string `sql:"size:255"` 12 CreatedAt time.Time 13 UpdatedAT time.Time 14 DeletedAt time.Time 15}

main.go

Go

1package main 2 3import ( 4 "github.com/zenazn/goji" 5 "github.com/jinzhu/gorm" 6 "github.com/zenazn/goji/web" 7 "github.com/zenazn/goji/web/middleware" 8 _ "github.com/go-sql-driver/mysql" 9) 10 11var db *gorm.DB 12 13func main() { 14 user := web.New() 15 goji.Handle("/user/*", user) 16 17~~中略~~ 18 user.Get("/index", UserIndex) 19 20 goji.Serve() 21} 22 23func init(){ 24 db, _ = gorm.Open("mysql", "root:@tcp(127.0.0.1:3306)/test") 25}

user_controller.go

Go

1package main 2 3import ( 4 "github.com/wcl48/valval" 5 "github.com/zenazn/goji/web" 6 7 "encoding/base64" 8 "fmt" 9 "html/template" 10 "models" 11 "net/http" 12 "strconv" 13 "strings" 14) 15 16var tpl *template.Template 17 18const Password = "user:user" 19 20type FormData struct { 21 User models.User 22 Mess string 23} 24 25func UserIndex(c web.C, w http.ResponseWriter, r *http.Request) { 26 Users := []models.User{} 27 fmt.Printf("%+v\n", Users) 28 db.Find(&Users) 29 tpl = template.Must(template.ParseFiles("view/user/index.html")) 30 tpl.Execute(w,Users) 31} 32 33~~以下略~~

また、テンプレートファイルは以下のように記述しています。

Go

1<html> 2<p>user index</p> 3{{range .}} 4<a href="/user/edit/{{.Id}}">{{.Name}}</a><br/> 5{{end}} 6<a href="/user/new">new</a> 7</html>

↓テンプレート表示結果です。
テンプレート表示結果

試したこと

Go

1Users := []models.User{} 23Users := models.User{} 4にしたところ、fmt.Printf("%+v\n", Users)は以下の様な出力結果になりました。 5 6{Id:0 Name: CreatedAt:0001-01-01 00:00:00 +0000 UTC UpdatedAT:0001-01-01 00:00:00 +0000 UTC DeletedAt:0001-01-01 00:00:00 +0000 UTC}

DBエラーの確認

Go

1func UserIndex(c web.C, w http.ResponseWriter, r *http.Request) { 2 Users := []models.User{} 3 fmt.Printf("%+v\n", Users) 4 db.Find(&Users) 5 db.GetErrors() //追加 6 tpl = template.Must(template.ParseFiles("view/user/index.html")) 7 tpl.Execute(w,Users) 8}

出力結果

2019/07/10 03:23:40.985372 Starting Goji on [::]:8080 2019/07/10 03:23:44.281110 [ip-172-31-20-61/A9HrA4LsBZ-000001] Started GET "/user/index" from 127.0.0.1:33898 [] 2019/07/10 03:23:44.285098 [ip-172-31-20-61/A9HrA4LsBZ-000001] Returning 200 in 3.959931ms

エラーの出力はありませんでした。

初歩的なことかもしれませんが、よろしくお願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

calkinos

2019/06/29 12:24

main.go の `init` でDB接続していますが、接続先が 128.0.0.1になっていますが、127.0.0.1のまちがいではありませんか? db接続時、戻り値のerrorを見ていませんが、errorでないことを確認していますか?
Sutasyu127

2019/07/02 06:26

ありがとうございます。 DB接続先は127.0.0.1にしていたのですが、 こちらに投稿する際に何かの拍子に変更してしまったようです・・・。 なので、実際は127.0.0.1でございました。 申し訳ないです、質問内容を編集しておきます。 念のため、127.0.0.1であることを確認した上で、 再度ログを出した結果が以下になります。 2019/07/02 06:25:33.571295 Starting Goji on [::]:8080 2019/07/02 06:25:37.077410 [ip-172-31-20-61/Gt9JZPRena-000001] Started GET "/user/index" from 127.0.0.1:55524 [] 2019/07/02 06:25:37.080088 [ip-172-31-20-61/Gt9JZPRena-000001] Returning 200 in 2.646623ms
intelf___

2019/07/08 06:22

findのあとテンプレートにデータを入れているみたいですが、テンプレートの出力はどうなっていますか?
Sutasyu127

2019/07/09 01:27

ありがとうございます。 内容追記いたしました。 よろしくお願いします。
intelf___

2019/07/10 02:04

find() 直後に db.GetErrors() を出力して、エラーが出ていないか確認できますか?
Sutasyu127

2019/07/10 03:29 編集

内容追記しました。 DBエラーが出ている痕跡はありませんでした・・・。 よろしくお願いします。
guest

回答2

0

私も日付がDATETIME型になっていると取得出来ませんでした。

DATETIME型でも出来る方法はあるのかも知れませんが、DBに登録するときに日付の型をDATE型にしたらとりあえずは表示出来ました。

こちらのサイトを参考にしました。
参考サイト

このサイトでは登録処理の箇所でnewYmdをdate型にして登録しています。

GORMは型の不整合によってデータを取得出来ない場合があるようです。
GORMの型について

投稿2020/09/22 01:27

nabex

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

構造体とDBのフィールドのマッピングが必要なのではないでしょうか。

https://gorm.io/docs/models.html

Users := []models.User{}

のままでトライしてみて下さい。

投稿2019/07/29 10:14

yu81

総合スコア90

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問