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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Amazon RDS

Amazon RDSは、米アマゾン社が提供しているRDBMSサービス。クラウド上でのリレーショナルデータベースの構築および運用が可能です。MySQL/PostgreSQL/Oracle/SQL Serverのインストールを容易にすることができます。

Go

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

Q&A

解決済

2回答

2737閲覧

postgreでselectしようとするとpanic

mimi_129

総合スコア63

Amazon RDS

Amazon RDSは、米アマゾン社が提供しているRDBMSサービス。クラウド上でのリレーショナルデータベースの構築および運用が可能です。MySQL/PostgreSQL/Oracle/SQL Serverのインストールを容易にすることができます。

Go

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

0グッド

0クリップ

投稿2021/08/28 08:02

前提・実現したいこと

GolangでRDS上のpostgreに接続してSELECTを行いたいのですが、上手くいきません。
何か必要な情報等ございましたら、随時追記していきますのでご指摘よろしくお願いします。

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

Running ... /home/ec2-user/environment/main.go panic: runtime error: invalid memory address or nil pointer dereference panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x4e4cb6] goroutine 1 [running]: database/sql.(*Rows).close(0x0, 0x0, 0x0, 0x0, 0x0) /usr/lib/golang/src/database/sql/sql.go:3155 +0x76 database/sql.(*Rows).Close(0x0, 0x0, 0x0) /usr/lib/golang/src/database/sql/sql.go:3151 +0x33 panic(0x65d900, 0x820fb0) /usr/lib/golang/src/runtime/panic.go:969 +0x1b9 database/sql.(*Rows).Next(0x0, 0x6e91c0) /usr/lib/golang/src/database/sql/sql.go:2835 +0x30 main.main() exit status 2 Process exited with code: 1 Pane is dead

該当のソースコード

package main import ( "database/sql" "fmt" _ "github.com/lib/pq" "log" ) const ( // Initialize connection constants. HOST = "RDSのエンドポイント:5432" DATABASE = "XXX" USER = "XXX" PASSWORD = "XXX" ) type Sale struct { Loginid string Password string } func main() { var connectionString string = fmt.Sprintf("host=%s user=%s password=%s dbname=%s sslmode=disable", HOST, USER, PASSWORD, DATABASE) db, err := sql.Open("postgres", connectionString) if err != nil { log.Fatalln("接続失敗", err) } defer db.Close() // 取得件数を条件[$1]にする // ?だとエラーが発生 //cmd := "select id, order_id from final_sales where id like $1" cmd := "select loginid, password from systemuser" //取得するデータが1件の場合は、QueryRowも利用できる rows, _ := db.Query(cmd) defer rows.Close() var sales []Sale // 取得するデータの構造体を用意(複数取得するのでスライス) for rows.Next() { var tmp Sale // 取得の格納用 err := rows.Scan(&tmp.Loginid, &tmp.Password) if err != nil { log.Fatalln("取得失敗", err) } sales = append(sales, tmp) } for _, sale := range sales { fmt.Println(sale.Loginid, sale.Password) } }

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

db.Queryが返すエラーを無視しないでください。

投稿2021/08/28 12:10

nobonobo

総合スコア3367

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

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

0

自己解決

RDSのインバウンドルールが閉じていたせいでSELECTが出来なかっただけでした。
プログラム上の問題はありませんでした。

投稿2021/08/29 06:51

mimi_129

総合スコア63

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

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

nobonobo

2021/08/29 09:44 編集

エラーを見ない事は問題です。 該当エラーを見ていればpanicにならないし、問題の原因をつかみやすいエラーメッセージが表示されたはずです。動作したからといって現状のままエラーを無視した実装をそのままにしておくのは将来手痛いことになります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問