#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 .. : (возникает та же ошибка