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

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

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

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

0回答

1233閲覧

GoでAPIを実装する際のクエリについて

KazumaInoue

総合スコア10

Go

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

1クリップ

投稿2020/04/19 21:19

前提・実現したいこと

GoのAPI実装を行っていますが、

rows_out_user, err_out_user := db.Query("SELECT * FROM user ORDER BY id DESC LIMIT 1;")

でエラーが発生します。

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

API server listening at: 127.0.0.1:37726 POST hello! test 2020/04/20 06:10:03 Connected to mysql. 2020/04/20 06:10:04 http: panic serving [::1]:57519: runtime error: invalid memory address or nil pointer dereference goroutine 6 [running]: net/http.(*conn).serve.func1(0xc00005caa0) c:/go/src/net/http/server.go:1772 +0x150 panic(0x8017a0, 0xad3370) c:/go/src/runtime/panic.go:975 +0x429 main.main.func1(0x8c5a80, 0xc0000b2000, 0xc0000a2000) c:/Users/nhs80412/Documents/CA_TECH_DOJO/hello.go:105 +0x15dc net/http.HandlerFunc.ServeHTTP(0x876230, 0x8c5a80, 0xc0000b2000, 0xc0000a2000) c:/go/src/net/http/server.go:2012 +0x4b net/http.(*ServeMux).ServeHTTP(0xadfce0, 0x8c5a80, 0xc0000b2000, 0xc0000a2000) c:/go/src/net/http/server.go:2387 +0x1ad net/http.serverHandler.ServeHTTP(0xc00012a000, 0x8c5a80, 0xc0000b2000, 0xc0000a2000) c:/go/src/net/http/server.go:2807 +0x216 net/http.(*conn).serve(0xc00005caa0, 0x8c6080, 0xc00008a000) c:/go/src/net/http/server.go:1895 +0x171d created by net/http.(*Server).Serve c:/go/src/net/http/server.go:2933 +0x938

該当のソースコード

Go

1package main 2 3import ( 4 "encoding/json" 5 "fmt" 6 // "io/ioutil" 7 "net/http" 8 // "Request.Body" 9 10 // ? 11 "bytes" 12 // ? 13 "io" 14 15 16 "database/sql" 17 "log" 18 _ "github.com/go-sql-driver/mysql" 19 20 jwt "github.com/dgrijalva/jwt-go" 21) 22var secretKey = "himitu" 23 24// jsonのSchema 25type InputJsonSchema struct { 26 Name string `json:"name"` 27} 28 29type NewUser struct { 30 ID int `json:"id"` 31 Name string `json:"name"` 32} 33 34func main() { 35 http.HandleFunc("/user/create", func(w http.ResponseWriter, r *http.Request) { 36 // request bodyの読み取り 37 38 //test 39 fmt.Fprintf(w, "<h1>Test</h1>") 40 41 switch r.Method { 42 case http.MethodGet: 43 w.WriteHeader(http.StatusOK) 44 fmt.Fprint(w, "GET hello!\n") 45 46 47 case http.MethodPost: 48 // w.WriteHeader(http.StatusCreated) 49 fmt.Fprint(w, "POST hello!\n") 50 51 body := r.Body 52 defer body.Close() 53 54 buf := new(bytes.Buffer) 55 io.Copy(buf, body) 56 57 58 var hello InputJsonSchema 59 json.Unmarshal(buf.Bytes(), &hello) 60 61 // w.WriteHeader(http.StatusCreated) 62 // fmt.Fprint(w, "POST hello! %v \n", hello.Name) 63 fmt.Printf("POST hello! %s \n", string(hello.Name)) 64 65 66 67 68 69 70 //mysqlへ接続。ドライバ名(mysql)と、ユーザー名・データソース(ここではgosample)を指定。 71 db, err := sql.Open("mysql", "root@/test") 72 log.Println("Connected to mysql.") 73 74 //接続でエラーが発生した場合の処理 75 if err != nil { 76 log.Fatal(err) 77 } 78 defer db.Close() 79 80 //データベースへクエリを送信。引っ張ってきたデータがrowsに入る。 81 // rows, err := db.Query("INSERT USER VALUES (1, " + string(hello.Name) + ",'Kyoto');") 82 rows, err := db.Query("INSERT INTO USER(name,token) VALUES ('" + string(hello.Name) + "','init');") 83 // rows, err := db.Query(fmt.Sprintf("INSERT USER VALUES (1, " + "Satou" + ", 'Kyoto');")) 84 defer rows.Close() 85 if err != nil { 86 panic(err.Error()) 87 } 88 89 90 // // INSERTしたレコードを読めるかテスト 91 // LIMIT := 1 92////////////////////////////////////////////////////////////////////////////////////////////////// 93// エラー箇所 94////////////////////////////////////////////////////////////////////////////////////////////////// 95 rows_out_user, err_out_user := db.Query("SELECT * FROM user ORDER BY id DESC LIMIT 1;") 96////////////////////////////////////////////////////////////////////////////////////////////////// 97// 98////////////////////////////////////////////////////////////////////////////////////////////////// 99defer rows_out_user.Close() 100 if err_out_user != nil { 101 panic(err_out_user.Error()) 102 } 103 var person NewUser //構造体Person型の変数personを定義 104 //レコード一件一件をあらかじめ用意しておいた構造体に当てはめていく。 105 for rows_out_user.Next() { 106 107 err := rows_out_user.Scan(&person.ID, &person.Name) 108 sample_json, _ := json.Marshal(person) 109 110 if err != nil { 111 panic(err_out_user.Error()) 112 } 113 fmt.Println(person.ID, person.Name) 114 fmt.Println(string(sample_json)) 115 } 116 117 118 119 120 //認証 121 //アルゴリズムの指定 122 token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{ 123 "id":person.ID, 124 "name":person.Name, 125 }) 126 127 128 //トークンに対して署名 129 tokenString, err_JWT := token.SignedString([]byte(secretKey)) 130 if err_JWT == nil { 131 fmt.Fprint(w, "json hello!\n") 132 fmt.Printf("POST hello! %s \n", tokenString) 133 } else { 134 fmt.Fprint(w, "Not Json hello!\n") 135 } 136 137 138 139 140 141 142 143 default: 144 // w.WriteHeader(http.StatusMethodNotAllowed) 145 fmt.Fprint(w, "Method not allowed.\n") 146 147 // ody := r.Body 148 149 } 150 }) 151 152 http.ListenAndServe(":8080", nil) 153}

予想

LIMIT 1が文字列になっているから?

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

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

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

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

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

m.ts10806

2020/04/20 00:12

そのSQLは直に実行してエラーのでないものですか?
KazumaInoue

2020/04/20 03:31

エラー出ません! 一つのレコードが抽出されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問