11

golang の構造体のタグの必要性と、golang でのリフレクトによるアクセス方法を知っています。しかし、SQL結果の構造体を作成する際に構造体でSQLタグを使用する必要がある理由についての質問に対する信頼できる答えを検索して見つけることができませんでした。私は多くのサンプル コードを調査しましたが、人々はsql:"index"構造体と構造体で使用していsql:"primary_key"ます。

これで、データベース レイヤーでのインデックス作成が完了しましたが、それで十分ではないでしょうか? sql:"index"最良の結果を得るには、あまりにも使用する必要がありますか? 同様に、データベースに主キー属性を定義しましたが、指定する必要sql:"primary_key"がありますか?

私のコードはそれらがなくてもうまくいくようです。それらの利点と使用法を知りたいだけです。

4

2 に答える 2

8

gormのような ORM ライブラリについて言及していると思います

その場合、sql:"primary_key"またはのようなメタデータsql:"index"は、ORM に、テーブルのセットアップまたは移行の試行中にインデックスを作成するように指示します。

gormでのいくつかの例: インデックス、主キー、外部キー、many2many リレーション、または既存のスキーマをgormモデルに適応させようとするとき、たとえば次のように明示的に型を設定する場合:

type Address struct {
    ID       int
    Address1 string         `sql:"not null;unique"` // Set field as not nullable and unique
    Address2 string         `sql:"type:varchar(100);unique"`
    Post     sql.NullString `sql:"not null"`
}
于 2015-11-21T20:21:19.350 に答える
0

使用しているパッケージとユースケースによって異なります。CRUDで十分ですか?ほとんどの場合、パッケージにそう記載されていない限り、これはまれですが可能性があります。いくつかのパッケージは、バグを引き起こす可能性のある魔​​法のフードの下で時々行います。これらの動作を認識している場合、またはコードで非常に明示的である場合は、おそらく回避するでしょう。

タグにインデックスを付けると、ほとんどの場合、パッケージの移行ツールを使用して、モデル宣言を SQL クエリ (CREATEステートメント) に変換できます。したがって、常に自分でこれを行いたい場合は、おそらくそのようなタグを追加する必要はありません。

ただし、パッケージにタグが必要な場合は、バグが発生する可能性があります。たとえば、 の場合gormModelメソッドは構造体ポインタを入力として受け取ります。この構造体に、IDそれを主キーとして使用するという名前のフィールドがある場合、つまりID値が「4」の場合、WHERE id=4自動的に が追加されます。構造体に がIDある場合は、タグを追加する必要さえなくprimary_key、1 つとして扱われます。この動作は、「非主キー」IDフィールドと、実際に主キーとして使用している別のフィールドの両方がある場合に問題を引き起こす可能性があります。の別の例gormこれです。可能な動作は、null 許容プロパティをチェックし、INSERTステートメントがNOT NULLフィールドを取得する場合にエラーをスローすることもできます。NULL価値。

別の注意として、構造体にタグを追加することは、DB 内のプロパティのコンテキストを提供するため、良い習慣と見なすことができます。

于 2021-06-30T12:24:41.027 に答える