[解決済み] GORMでレコードを作成・更新するには?
2022-02-10 16:56:24
質問事項
ゴームは
FirstOrCreate
メソッドと
FirstOrInit
しかし、レコードが実際に作成されたかどうかを後で確認するにはどうしたらよいでしょうか。私はそれが存在しない場合、レコードを作成し、それが存在する場合、私はいくつかのフィールドを更新したい。
どのように解決するのですか?
アップデート 2020.10.09
謝辞 ヴァイリン
1.20.x以降、GORMは異なるデータベースに対して互換性のあるUpsertサポートを提供します( アップサート・オン・コンフリクト )
// Update columns to new value on `id` conflict
DB.Clauses(clause.OnConflict{
Columns: []clause.Column{{Name: "id"}}, // key colume
DoUpdates: clause.AssignmentColumns([]string{"name", "age"}), // column needed to be updated
}).Create(&users)
// MERGE INTO "users" USING *** WHEN NOT MATCHED THEN INSERT *** WHEN MATCHED THEN UPDATE SET "name"="excluded"."name"; SQL Server
// INSERT INTO "users" *** ON CONFLICT ("id") DO UPDATE SET "name"="excluded"."name", "age"="excluded"."age"; PostgreSQL
// INSERT INTO `users` *** ON DUPLICATE KEY UPDATE `name`=VALUES(name),`age=VALUES(age); MySQL
gorm 1.9.x以下では、最初に更新を行い、存在しないときに挿入するのが効率的です。
// update only set name=nick
if err := db.Model(&newUser).Where("id = ?", 3333).Update("name", "nick").Error; err != nil {
// always handle error like this, cause errors maybe happened when connection failed or something.
// record not found...
if gorm.IsRecordNotFoundError(err){
db.Create(&newUser) // create new record from newUser
}
}
FirstOrInit
と
FirstOrCreate
が異なる場合。データベース内に一致するレコードがない場合。
FirstOrInit
は構造体を開始しますが、レコードは作成されません。
FirstOrCreate
はレコードを作成し、そのレコードを構造体にクエリします。
関連
-
[解決済み] Notepad++ 用の Go 言語プラグイン
-
Windowsのプロパティダイアログボックスのエンコーディングの問題 ファイル名、ディレクトリ名、ボリュームラベルの構文が正しくありません。
-
[解決済み] キューの実装はありますか?
-
[解決済み] go言語でUUIDを生成する方法はありますか?
-
[解決済み] 全モジュールのアップデートを行う
-
[解決済み] goで文字列の連結を効率的に行う方法
-
[解決済み] Goでファイルが存在するかどうかを確認する方法は?
-
[解決済み】C言語の三項演算子に相当するGoの慣用句は何ですか?
-
[解決済み】関数宣言の構文:関数名の前に括弧でくくられたもの
-
[解決済み】Goはサードパーティ・パッケージをどのようにアップデートしますか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] GO言語:致命的なエラー:すべてのゴルーチンがスリープしている - デッドロック
-
[解決済み] go run: 非メインパッケージは実行できません
-
[解決済み] インポート "google/api/annotations.proto" が見つからないか、エラーが発生しました。依存関係として追加するにはどうすればよいですか?
-
[解決済み] Go パッケージは log.Fatal を使うべきですか、そしてそれはいつですか?
-
コンパイル: バージョン "" は go ツールのバージョン "" と一致しません。
-
[解決済み] goでローカルパッケージをインポートするには?
-
[解決済み] 環境変数GOPRIVATEの設定方法
-
[解決済み] Goで部分文字列を抽出する
-
[解決済み】Goで設定を処理する方法【終了しました
-
[解決済み】チャンネルを開いたままにしておいてもいいのでしょうか?