まだ正規化されていないデータベースで作業していますが、このテーブルには40を超える列のレコードが含まれています。私はこのコードを呼び出すと、Scan
は、それが「42個のデスティネーション引数ではなく、1を期待」と文句を言いGoの構造体に大きな行をスキャンする
type Coderyte struct {
ID int `json:"id"`
EmrID int `json:"emr_id"`
DftID int `json:"dft_id"`
Fix int `json:"fix"`
ReportDate string `json:"report_date"` // Time?
Patient string `json:"patient"`
... // etc
}
func ReadCoderyte(res http.ResponseWriter, req *http.Request) {
rows, err := db.Query("SELECT * FROM coderyte")
if err != nil {
http.Error(res, "Error querying database", 500)
}
defer rows.Close()
// Convert rows into a slice of Coderyte structs
coderytes := make([]*Coderyte, 0)
for rows.Next() {
coderyte := new(Coderyte)
err := rows.Scan(&coderyte) // Expected 42 columns
if err != nil {
panic(err)
http.Error(res, "Error converting coderyte object", 500)
}
coderytes = append(coderytes, coderyte)
}
:以下
は大きな構造体にレコードをスキャンする(しよう)のための私のGoコードです。私の理解では、私の検索すなわちScan(&coderyte.ID, &coderyte.EmrID, etc)
、私はスキャン呼び出しの内部で、この大規模な構造体のすべての単一のフィールドに対処する必要があるだろうということですのみを示唆答えはsqlx
を使用することですthis other questionを、得られています。サードパーティのツールを使用しないようにしたい場合は、サードパーティのツールを使用しないようにしています。
私の質問は次のようになっています:大規模なデータベースレコードをすべての単一フィールドを指定せずに構造体に変換する方法はありますか?。
この関数の最終目標はオブジェクトのJSON配列を返すことですが、重要ではないと感じてコードのその部分は含めませんでした。 Scan
をバイパスしてJSONを返す方法がある場合は、それも分かります。
短い回答:いいえ。 長い答え:sqlxもお勧めします。標準ライブラリは、構造体へのアンマーシャリングをサポートしていません。 –
私と同じ勧告もあります。 – RayfenWindspear
これはサポートされていませんが、まだ標準のsqlパッケージを使用したい場合は、http://go-database-sql.org/retrieving.html –