Как отключить IDENTITY_INSERT для GORM

#sql-server #go #go-gorm

#sql-сервер #Вперед #go-gorm

Вопрос:

Я хотел бы отключить IDENTITY_INSERT вставлять данные с помощью GORM без указания какого-либо идентификатора.

Я пытаюсь это :

 func main() {

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

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

    for _, user := range users {
        db.Create(amp;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.)
  

в en :

 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"}
  

У кого-нибудь есть идеи?

Комментарии:

1. Можете ли вы определить «это не работает»? Что это значит?

2. Что означает GORM?

3. @MisterPositive При наведении курсора мыши на тег вы увидите: GORM is Grails' object relational mapping (ORM) implementation.

4. @TT ЛОЛ, пропустил флаг. дух…

5. Вы действительно уверены, что хотите вставить явное значение для столбца ID, когда этот столбец явно является столбцом IDENTITY? Предполагается, что значения в столбце identity должны генерироваться ядром базы данных, а не вами на уровне представления.

Ответ №1:

вы должны использовать транзакцию

 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
}
  

Ответ №2:

Если вам действительно нужно это сделать, и для этого есть редкие случаи, вы должны включить эту функциональность (чтобы установить значение для столбца identity ) следующим образом

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

Если вы не пытаетесь установить значение столбца identity, то удалите из вашего запроса часть SET Identity_Insert dbo.users Off инструкции SET Identity_Insert dbo.users Off.

Комментарии:

1. Я не видел включенной части в приведенном выше примере вашего кода, и в ошибке четко указано, что Identity_Insert имеет значение off.

2. следующее msdn.microsoft.com/fr-fr/library/ms188059.aspx Identity_Insert должен быть отключен, чтобы вставить элемент БЕЗ определенного идентификатора

3. Нет — вы должны установить Identity_Insert включенным, чтобы разрешить вставки, в которых вы хотите указать значение для столбца identity, затем вы отключаете его, отключив. Включенный код является правильным способом вставки в таблицу со столбцом Identity

4. это тоже не работает со значением ON .. : (возникает та же ошибка