2017-07-03 3 views
0

が呼び出された後で同じ*sql.Rowsを再利用することは可能ですか?他の関数に渡すことはできますか?ゴランのsql.Rowsを再利用するかコピーする

rows, err := db.Query(...) 
for rows.Next() { 
    // rows.Scan() 
} 
anotherFunction(rows) // NOT WORKING: This rows became empty. 

*sql.Rowsの別のコピーを作成しようとしましたが、機能しませんでした。あなたがそれらを読んだ後

rows, err := db.Query(...) 
anotherRows := *rows 
// PANIC: call of load copies lock value: database/sql.Rows contains sync.RWMutex 
+1

errが返されると、行はゼロになり、逆参照 '* rows'はクラッシュします。 – mattn

答えて

0

database/sqlパッケージは、rewind行に任意の手段を提供していない、すなわち、それは「前方のみ」の結果セットです。

さらに、内部にある(物理的な)データベース接続へのリンクを維持しているため、コピーしたり渡したりするのは悪い考えです。

データに複数の関数を適用する必要がある場合は、すべての行をScanとし、データオブジェクトのスライスを取得してからこれを渡します。

スキャンはあなたが読み込まれたデータのコピーを作成します。値に一致した行から列がdestがで指さ

スキャンコピーを。

ますので、その後、安全にお使いRowsオブジェクト(任意の関連するデータベース・リソースを解放するには)Closeことができます。

クエリ(err)を実行した後、そして行を読み取った後に、rows.Err()を介してエラーも監視する必要があります。

関連する問題