1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

jackc/pgxでクエリー実行時にconn busyと出る場合

Last updated at Posted at 2023-01-31

クエリーを複数回実行する場合は、一度も 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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?