瀏覽代碼

add more test for join find

* fix tablename bug when sync2
xormplus 7 年之前
父節點
當前提交
fbd4a043de
共有 6 個文件被更改,包括 67 次插入5 次删除
  1. 1 1
      engine.go
  2. 10 2
      error.go
  3. 1 1
      session.go
  4. 25 0
      session_find_test.go
  5. 1 1
      session_schema.go
  6. 29 0
      session_schema_test.go

+ 1 - 1
engine.go

@@ -1117,7 +1117,7 @@ func (engine *Engine) idOfV(rv reflect.Value) (core.PK, error) {
 			}
 			}
 			fieldName = parts[1]
 			fieldName = parts[1]
 		}
 		}
-		//		fmt.Println(table.Name, fieldName, v)
+
 		pkField := v.FieldByName(fieldName)
 		pkField := v.FieldByName(fieldName)
 		switch pkField.Kind() {
 		switch pkField.Kind() {
 		case reflect.String:
 		case reflect.String:

+ 10 - 2
error.go

@@ -30,10 +30,18 @@ var (
 	ErrNotImplemented = errors.New("Not implemented")
 	ErrNotImplemented = errors.New("Not implemented")
 	// ErrConditionType condition type unsupported
 	// ErrConditionType condition type unsupported
 	ErrConditionType = errors.New("Unsupported condition type")
 	ErrConditionType = errors.New("Unsupported condition type")
-	// ErrColumnIsNotExist columns is not exist
-	ErrFieldIsNotExist = errors.New("Field does not exist")
 )
 )
 
 
+// ErrFieldIsNotExist columns does not exist
+type ErrFieldIsNotExist struct {
+	FieldName string
+	TableName string
+}
+
+func (e ErrFieldIsNotExist) Error() string {
+	return fmt.Sprintf("field %s is not valid on table %s", e.FieldName, e.TableName)
+}
+
 // ErrFieldIsNotValid is not valid
 // ErrFieldIsNotValid is not valid
 type ErrFieldIsNotValid struct {
 type ErrFieldIsNotValid struct {
 	FieldName string
 	FieldName string

+ 1 - 1
session.go

@@ -287,7 +287,7 @@ func (session *Session) doPrepare(db *core.DB, sqlStr string) (stmt *core.Stmt,
 func (session *Session) getField(dataStruct *reflect.Value, key string, table *core.Table, idx int) (*reflect.Value, error) {
 func (session *Session) getField(dataStruct *reflect.Value, key string, table *core.Table, idx int) (*reflect.Value, error) {
 	var col *core.Column
 	var col *core.Column
 	if col = table.GetColumnIdx(key, idx); col == nil {
 	if col = table.GetColumnIdx(key, idx); col == nil {
-		return nil, ErrFieldIsNotExist
+		return nil, ErrFieldIsNotExist{key, table.Name}
 	}
 	}
 
 
 	fieldValue, err := col.ValueOfV(dataStruct)
 	fieldValue, err := col.ValueOfV(dataStruct)

+ 25 - 0
session_find_test.go

@@ -767,3 +767,28 @@ func TestFindCacheLimit(t *testing.T) {
 		assert.EqualValues(t, 1, len(beans2))
 		assert.EqualValues(t, 1, len(beans2))
 	}
 	}
 }
 }
+
+func TestFindJoin(t *testing.T) {
+	type SceneItem struct {
+		Type     int
+		DeviceId int64
+	}
+
+	type DeviceUserPrivrels struct {
+		UserId   int64
+		DeviceId int64
+	}
+
+	assert.NoError(t, prepareEngine())
+	assertSync(t, new(SceneItem), new(DeviceUserPrivrels))
+
+	var scenes []SceneItem
+	err := testEngine.Join("LEFT OUTER", "device_user_privrels", "device_user_privrels.device_id=scene_item.device_id").
+		Where("scene_item.type=?", 3).Or("device_user_privrels.user_id=?", 339).Find(&scenes)
+	assert.NoError(t, err)
+
+	scenes = make([]SceneItem, 0)
+	err = testEngine.Join("LEFT OUTER", new(DeviceUserPrivrels), "device_user_privrels.device_id=scene_item.device_id").
+		Where("scene_item.type=?", 3).Or("device_user_privrels.user_id=?", 339).Find(&scenes)
+	assert.NoError(t, err)
+}

+ 1 - 1
session_schema.go

@@ -248,7 +248,7 @@ func (session *Session) Sync2(beans ...interface{}) error {
 			return err
 			return err
 		}
 		}
 		structTables = append(structTables, table)
 		structTables = append(structTables, table)
-		tbName := session.tbNameNoSchema(table)
+		tbName := engine.TableName(bean)
 		tbNameWithSchema := engine.TableName(tbName, true)
 		tbNameWithSchema := engine.TableName(tbName, true)
 
 
 		var oriTable *core.Table
 		var oriTable *core.Table

+ 29 - 0
session_schema_test.go

@@ -82,12 +82,41 @@ func (SyncTable2) TableName() string {
 	return "sync_table1"
 	return "sync_table1"
 }
 }
 
 
+type SyncTable3 struct {
+	Id     int64
+	Name   string `xorm:"unique"`
+	Number string `xorm:"index"`
+	Dev    int
+	Age    int
+}
+
+func (s *SyncTable3) TableName() string {
+	return "sync_table1"
+}
+
 func TestSyncTable(t *testing.T) {
 func TestSyncTable(t *testing.T) {
 	assert.NoError(t, prepareEngine())
 	assert.NoError(t, prepareEngine())
 
 
 	assert.NoError(t, testEngine.Sync2(new(SyncTable1)))
 	assert.NoError(t, testEngine.Sync2(new(SyncTable1)))
 
 
+	tables, err := testEngine.DBMetas()
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, len(tables))
+	assert.EqualValues(t, "sync_table1", tables[0].Name)
+
 	assert.NoError(t, testEngine.Sync2(new(SyncTable2)))
 	assert.NoError(t, testEngine.Sync2(new(SyncTable2)))
+
+	tables, err = testEngine.DBMetas()
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, len(tables))
+	assert.EqualValues(t, "sync_table1", tables[0].Name)
+
+	assert.NoError(t, testEngine.Sync2(new(SyncTable3)))
+
+	tables, err = testEngine.DBMetas()
+	assert.NoError(t, err)
+	assert.EqualValues(t, 1, len(tables))
+	assert.EqualValues(t, "sync_table1", tables[0].Name)
 }
 }
 
 
 func TestIsTableExist(t *testing.T) {
 func TestIsTableExist(t *testing.T) {