簡體   English   中英

如何關閉 GORM 的 IDENTITY_INSERT

[英]How to turn OFF IDENTITY_INSERT for GORM

我想關閉IDENTITY_INSERT以在不指定任何 ID 的情況下使用 GORM 插入數據。

我試試這個:

func main() {

    db, err := gorm.Open("mssql", "...")

    //...
    db.DropTable(&User{})
    db.CreateTable(&User{})
    db.Exec("SET IDENTITY_INSERT users OFF;") <-- this doesn't work

    for _, user := range users {
        db.Create(&user)
    }

}

type User struct {
    ID        uint
    UserName  string
    FirstName string
    LastName  string
}

var users []User = []User{
    User{UserName: "testUserName", FirstName: "testFirstName", LastName: "TestLastName"},
    User{UserName: "testUserName", FirstName: "testFirstName", LastName: "TestLastName"},
    User{UserName: "testUserName", FirstName: "testFirstName", LastName: "TestLastName"},
}

編輯:

數據不是在數據庫中創建的,我有以下錯誤(法語抱歉):

(mssql: Une valeur explicite doit être spécifiée dans la colonne d'identité de la table 'users' quand IDENTITY_INSERT est défini à ON, ou qu'un utilisateur de la réplication effectue une insertion dans une colonne d'identité NOT FOR REPLICATION.)

在 :

Cannot insert explicit value for identity column in table 'users' when IDENTITY_INSERT is set to OFF."

如果我添加 ID 值,該程序將工作,例如:

User{ID: 1, UserName: "testUserName", FirstName: "testFirstName", LastName: "TestLastName"}

有人有什么想法嗎?

你必須使用交易

tx := db.Begin()
if err := tx.Exec("SET IDENTITY_INSERT users OFF;").Error; err != nil {
    return err
}
if err := tx.Commit().Error; err != nil {
    return err
}

如果您真的需要這樣做,並且在極少數情況下您必須啟用此功能(設置標識列的值),如下所示

Set Identity_Insert dbo.users On
Insert Into users (YOURIDENTITYCOLUMN, NAME)
Values(1, 'your value')
Set Identity_Insert dbo.users Off

如果您不嘗試設置標識列的值,則從您的查詢中刪除語句 SET Identity_Insert dbo.users Off 部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM