### 插入數據
插入數據使用Insert方法,Insert方法的參數可以是一個或多個Struct的指針,一個或多個Struct的Slice的指針。
如果傳入的是Slice并且當數據庫支持批量插入時,Insert會使用批量插入的方式進行插入。
- 插入一條數據,此時可以用Insert或者InsertOne
~~~
user := new(User)
user.Name = "myname"
affected, err := engine.Insert(user)
// INSERT INTO user (name) values (?)
~~~
在插入單條數據成功后,如果該結構體有自增字段,則自增字段會被自動賦值為數據庫中的id。這里需要注意的是,如果插入的結構體中,自增字段已經賦值,則該字段會被作為非自增字段插入。
~~~
fmt.Println(user.Id)
~~~
- 插入同一個表的多條數據,此時如果數據庫支持批量插入,那么會進行批量插入,但是這樣每條記錄就無法被自動賦予id值。如果數據庫不支持批量插入,那么就會一條一條插入。
~~~
users := make([]User, 0)
users[0].Name = "name0"
...
affected, err := engine.Insert(&users)
~~~
- 使用指針Slice插入多條記錄,同上
~~~
users := make([]*User, 0)
users[0] = new(User)
users[0].Name = "name0"
...
affected, err := engine.Insert(&users)
~~~
- 插入多條記錄并且不使用批量插入,此時實際生成多條插入語句,每條記錄均會自動賦予Id值。
~~~
users := make([]*User, 0)
users[0] = new(User)
users[0].Name = "name0"
...
affected, err := engine.Insert(users...)
~~~
- 插入不同表的一條記錄
~~~
user := new(User)
user.Name = "myname"
question := new(Question)
question.Content = "whywhywhwy?"
affected, err := engine.Insert(user, question)
~~~
- 插入不同表的多條記錄
~~~
users := make([]User, 0)
users[0].Name = "name0"
...
questions := make([]Question, 0)
questions[0].Content = "whywhywhwy?"
affected, err := engine.Insert(&users, &questions)
~~~
- 插入不同表的一條或多條記錄
~~~
user := new(User)
user.Name = "myname"
...
questions := make([]Question, 0)
questions[0].Content = "whywhywhwy?"
affected, err := engine.Insert(user, &questions)
~~~
這里需要注意以下幾點:
- 這里雖然支持同時插入,但這些插入并沒有事務關系。因此有可能在中間插入出錯后,后面的插入將不會繼續。此時前面的插入已經成功,如果需要回滾,請開啟事物。
- 批量插入會自動生成`Insert into table values (),(),()`的語句,因此各個數據庫對SQL語句有長度限制,因此這樣的語句有一個最大的記錄數,根據經驗測算在150條左右。大于150條后,生成的sql語句將太長可能導致執行失敗。因此在插入大量數據時,目前需要自行分割成每150條插入一次。