fix: dup filed in inconsistent schema and database
This commit is contained in:
		
							parent
							
								
									a6b8eb4ba4
								
							
						
					
					
						commit
						5163bb9107
					
				
							
								
								
									
										16
									
								
								scan.go
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								scan.go
									
									
									
									
									
								
							@ -193,15 +193,21 @@ func Scan(rows Rows, db *DB, mode ScanMode) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
			// Not Pluck
 | 
								// Not Pluck
 | 
				
			||||||
			if sch != nil {
 | 
								if sch != nil {
 | 
				
			||||||
 | 
									schFiledCount := len(sch.Fields)
 | 
				
			||||||
				for idx, column := range columns {
 | 
									for idx, column := range columns {
 | 
				
			||||||
					if field := sch.LookUpField(column); field != nil && field.Readable {
 | 
										if field := sch.LookUpField(column); field != nil && field.Readable {
 | 
				
			||||||
						if curIndex, ok := selectedColumnsMap[column]; ok {
 | 
											if curIndex, ok := selectedColumnsMap[column]; ok {
 | 
				
			||||||
							fields[idx] = field // handle duplicate fields
 | 
												fields[idx] = field // handle duplicate fields
 | 
				
			||||||
							for fieldIndex, selectField := range sch.Fields[curIndex+1:] {
 | 
												offset := curIndex + 1
 | 
				
			||||||
								if selectField.DBName == column && selectField.Readable {
 | 
												// handle sch inconsistent with database
 | 
				
			||||||
									selectedColumnsMap[column] = curIndex + fieldIndex + 1
 | 
												// like Raw(`...`).Scan
 | 
				
			||||||
									fields[idx] = selectField
 | 
												if schFiledCount > offset {
 | 
				
			||||||
									break
 | 
													for fieldIndex, selectField := range sch.Fields[offset:] {
 | 
				
			||||||
 | 
														if selectField.DBName == column && selectField.Readable {
 | 
				
			||||||
 | 
															selectedColumnsMap[column] = curIndex + fieldIndex + 1
 | 
				
			||||||
 | 
															fields[idx] = selectField
 | 
				
			||||||
 | 
															break
 | 
				
			||||||
 | 
														}
 | 
				
			||||||
								}
 | 
													}
 | 
				
			||||||
							}
 | 
												}
 | 
				
			||||||
						} else {
 | 
											} else {
 | 
				
			||||||
 | 
				
			|||||||
@ -221,4 +221,21 @@ func TestScanToEmbedded(t *testing.T) {
 | 
				
			|||||||
		t.Errorf("Failed to run join query, got error: %v", err)
 | 
							t.Errorf("Failed to run join query, got error: %v", err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	AssertEqual(t, person1, personDupField)
 | 
						AssertEqual(t, person1, personDupField)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						user := User{
 | 
				
			||||||
 | 
							Name: "TestScanToEmbedded_1",
 | 
				
			||||||
 | 
							Manager: &User{Name: "TestScanToEmbedded_1_m1",
 | 
				
			||||||
 | 
								Manager: &User{Name: "TestScanToEmbedded_1_m1_m1"},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						DB.Create(&user)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						type UserScan struct {
 | 
				
			||||||
 | 
							ID        uint
 | 
				
			||||||
 | 
							Name      string
 | 
				
			||||||
 | 
							ManagerID *uint
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						var user2 UserScan
 | 
				
			||||||
 | 
						err := DB.Raw("SELECT * FROM users INNER JOIN users Manager ON users.manager_id = Manager.id WHERE users.id = ?", user.ID).Scan(&user2).Error
 | 
				
			||||||
 | 
						AssertEqual(t, err, nil)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user