Add TableName with NamingStrategy support, close #5726
This commit is contained in:
		
							parent
							
								
									e8f48b5c15
								
							
						
					
					
						commit
						34fbe84580
					
				| @ -71,6 +71,10 @@ type Tabler interface { | |||||||
| 	TableName() string | 	TableName() string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | type TablerWithNamer interface { | ||||||
|  | 	TableName(Namer) string | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Parse get data type from dialector
 | // Parse get data type from dialector
 | ||||||
| func Parse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, error) { | func Parse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, error) { | ||||||
| 	return ParseWithSpecialTableName(dest, cacheStore, namer, "") | 	return ParseWithSpecialTableName(dest, cacheStore, namer, "") | ||||||
| @ -125,6 +129,9 @@ func ParseWithSpecialTableName(dest interface{}, cacheStore *sync.Map, namer Nam | |||||||
| 	if tabler, ok := modelValue.Interface().(Tabler); ok { | 	if tabler, ok := modelValue.Interface().(Tabler); ok { | ||||||
| 		tableName = tabler.TableName() | 		tableName = tabler.TableName() | ||||||
| 	} | 	} | ||||||
|  | 	if tabler, ok := modelValue.Interface().(TablerWithNamer); ok { | ||||||
|  | 		tableName = tabler.TableName(namer) | ||||||
|  | 	} | ||||||
| 	if en, ok := namer.(embeddedNamer); ok { | 	if en, ok := namer.(embeddedNamer); ok { | ||||||
| 		tableName = en.Table | 		tableName = en.Table | ||||||
| 	} | 	} | ||||||
|  | |||||||
							
								
								
									
										12
									
								
								tests/go.mod
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								tests/go.mod
									
									
									
									
									
								
							| @ -3,17 +3,15 @@ module gorm.io/gorm/tests | |||||||
| go 1.16 | go 1.16 | ||||||
| 
 | 
 | ||||||
| require ( | require ( | ||||||
| 	github.com/denisenkom/go-mssqldb v0.12.2 // indirect |  | ||||||
| 	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect | 	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect | ||||||
| 	github.com/google/uuid v1.3.0 | 	github.com/google/uuid v1.3.0 | ||||||
| 	github.com/jinzhu/now v1.1.5 | 	github.com/jinzhu/now v1.1.5 | ||||||
| 	github.com/lib/pq v1.10.7 | 	github.com/lib/pq v1.10.7 | ||||||
| 	github.com/mattn/go-sqlite3 v1.14.15 // indirect | 	golang.org/x/crypto v0.0.0-20221005025214-4161e89ecf1b // indirect | ||||||
| 	golang.org/x/crypto v0.0.0-20220926161630-eccd6366d1be // indirect | 	gorm.io/driver/mysql v1.4.0 | ||||||
| 	gorm.io/driver/mysql v1.3.6 | 	gorm.io/driver/postgres v1.4.1 | ||||||
| 	gorm.io/driver/postgres v1.3.10 | 	gorm.io/driver/sqlite v1.4.1 | ||||||
| 	gorm.io/driver/sqlite v1.3.6 | 	gorm.io/driver/sqlserver v1.4.0 | ||||||
| 	gorm.io/driver/sqlserver v1.3.2 |  | ||||||
| 	gorm.io/gorm v1.23.10 | 	gorm.io/gorm v1.23.10 | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -5,6 +5,8 @@ import ( | |||||||
| 	"testing" | 	"testing" | ||||||
| 
 | 
 | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
|  | 	"gorm.io/gorm/schema" | ||||||
|  | 	"gorm.io/gorm/utils/tests" | ||||||
| 	. "gorm.io/gorm/utils/tests" | 	. "gorm.io/gorm/utils/tests" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| @ -145,3 +147,27 @@ func TestTableWithAllFields(t *testing.T) { | |||||||
| 
 | 
 | ||||||
| 	AssertEqual(t, r.Statement.Vars, []interface{}{2, 4, 1, 3}) | 	AssertEqual(t, r.Statement.Vars, []interface{}{2, 4, 1, 3}) | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | type UserWithTableNamer struct { | ||||||
|  | 	gorm.Model | ||||||
|  | 	Name string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (UserWithTableNamer) TableName(namer schema.Namer) string { | ||||||
|  | 	return namer.TableName("user") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func TestTableWithNamer(t *testing.T) { | ||||||
|  | 	var db, _ = gorm.Open(tests.DummyDialector{}, &gorm.Config{ | ||||||
|  | 		NamingStrategy: schema.NamingStrategy{ | ||||||
|  | 			TablePrefix: "t_", | ||||||
|  | 		}}) | ||||||
|  | 
 | ||||||
|  | 	sql := db.ToSQL(func(tx *gorm.DB) *gorm.DB { | ||||||
|  | 		return tx.Model(&UserWithTableNamer{}).Find(&UserWithTableNamer{}) | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
|  | 	if !regexp.MustCompile("SELECT \\* FROM `t_users`").MatchString(sql) { | ||||||
|  | 		t.Errorf("Table with namer, got %v", sql) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | |||||||
| @ -2,6 +2,7 @@ package tests | |||||||
| 
 | 
 | ||||||
| import ( | import ( | ||||||
| 	"gorm.io/gorm" | 	"gorm.io/gorm" | ||||||
|  | 	"gorm.io/gorm/callbacks" | ||||||
| 	"gorm.io/gorm/clause" | 	"gorm.io/gorm/clause" | ||||||
| 	"gorm.io/gorm/logger" | 	"gorm.io/gorm/logger" | ||||||
| 	"gorm.io/gorm/schema" | 	"gorm.io/gorm/schema" | ||||||
| @ -13,7 +14,14 @@ func (DummyDialector) Name() string { | |||||||
| 	return "dummy" | 	return "dummy" | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (DummyDialector) Initialize(*gorm.DB) error { | func (DummyDialector) Initialize(db *gorm.DB) error { | ||||||
|  | 	callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ | ||||||
|  | 		CreateClauses:        []string{"INSERT", "VALUES", "ON CONFLICT", "RETURNING"}, | ||||||
|  | 		UpdateClauses:        []string{"UPDATE", "SET", "WHERE", "RETURNING"}, | ||||||
|  | 		DeleteClauses:        []string{"DELETE", "FROM", "WHERE", "RETURNING"}, | ||||||
|  | 		LastInsertIDReversed: true, | ||||||
|  | 	}) | ||||||
|  | 
 | ||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Jinzhu
						Jinzhu