クエリーを複数回実行する場合は、一度も Scan()
せず次のクエリーを実行しようとすると下記のエラーが出ます。
conn busy
誤
err = conn.QueryRow(context.Background(), "INSERT INTO users(screen_name) VALUES ('go');")
err = conn.QueryRow(context.Background(), "INSERT INTO users(screen_name) VALUES ('mod');") // error!
rows, err := conn.Query(context.Background(), "INSERT INTO users(screen_name) VALUES ('tidy');") // error!
次のクエリー実行前に必ず Scan()
するか、 INSERT
, UPDATE
など値を取得する必要がないクエリーには Query()
(QueryRow()
) の代わりに Exec()
を使います。
Exec()を使った例
cmd, err := conn.Exec(context.Background(), "INSERT INTO users(screen_name) VALUES ('tidy');")
(単体テストなどで)クエリー実行後のエラー処理をすり抜けて次のクエリーが実行されてしまった場合もこのエラーが出ます。
conn busyと出た場合の対処方法として「conn.Release()
が実行されているか確認する」というのもありましたが、慣れていないのでハマりました。
参考
"conn busy" error, help please [SOLVED] ;) · Issue #1124 · jackc/pgx · GitHub
https://github.com/jackc/pgx/issues/1124#issuecomment-990527007