問題タブ [pq]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - 挿入が実際に成功した場合でも、postgres に挿入した後に ErrNoRows("sql: no rows in result set") が発生するのはなぜですか?
私はgolang-postgresで作業しています:
私がやっていること:
選択クエリを実行します。選択時にエントリが得られない場合は、先に進んで挿入します。そうでなければ、更新、または何か...
問題は、インサートがErrNoRows("sql: no rows in result set")を返すたびに、 INSERT が成功し、行が追加されたことをデータベースで確認できる場合でもです。
また、 lastInsertIDは常に 0 のままですが、DB をチェックインすると、実際の値 (131 など) になります。
以下のコードのコメント 2付近のエラーがどこかにキャッシュされ、再び表示されるようです。
database/sql内でデバッグすると、以下のコード ブロックでこのエラーが返されていることがわかります。
しかし毎回、DB をチェックインすると、データは常に既に挿入されています。
編集:
go - 返されるエラーをアンダースコアに割り当てる
postgres データベースと対話するためのドライバーを提供する github.com/lib/pq から Golang コードをいくつか読んでいます。
私がこれに出くわしたコードの中で:
キャンセル機能は次のようになります。
私が知る限り、アンダースコアは型に関する静的アサーションとして使用されていません (したがって、コンパイラは、私が見る限り (この例のように)副作用を評価しません)、そうではありません。 t 作成者がそれを破棄したい場合がある 2 番目のパラメーター。
要約すると、なぜキャンセル関数の結果 (エラー) をアンダースコアに割り当てるのでしょうか?
postgresql - 特定の関数から一般的な関数を作成する (リファクタリング)
createUsers
テストのためだけに、func を使用して偽の DB にデータを入力しています。
pq
( https://godoc.org/github.com/lib/pq#hdr-Bulk_imports )の一括インポート機能を使用しています。
このコードのすべてがうまく機能しています。
必要なもの:
私が今必要としているのは、ユーザーモデルだけでなく、「一般的」にすることです。
次のようなものが必要だと思います:
次のような関数DBBulkInsert
で:
問題:
明らか_, err = stmt.Exec(row[0], row[1])
に完全に間違っています。DBBulkInsert
users 配列で呼び出す方法がわかりません。
まだ良いです:
のパラメータも削除できるかもしれませんが"users", "username", "age"
、DBBulkInsert(users, "users", "username", "age")
どうすればよいですか? 反射?
go - "pq: 申し訳ありませんが、クライアントが多すぎます" - Scan() を使用して行を閉じていますが、どこかで接続リークが発生しています
私のコードは、クエリを作成するたびに DB を開き、QueryRow() を実行し、結果を変数にスキャンしてから、defer を使用して DB と行を閉じるように設定されています。ただし、接続リークが発生していますが、すべてを閉じていると思います。
close ステートメントを defer から取り出して、使い終わったときに閉じようとしました。Goで行挿入のために単一のPostgres DB接続を再利用する方法に従ってください? しかし、私は答えに従っていると信じていますが、それでも運はありません。
ほとんどの場合、うまく機能します。しかし、このコードは一定間隔で実行され、しばらくすると「pq: 申し訳ありませんが、クライアントが多すぎます」というエラーが表示されます。それだけです。