光说有毛用


xorm JSON结构测试

· by admin · Read in about 3 min · (444 Words)
one two 

xorm

xorm官网 https://xorm.io xorm是一个轻量级的golang orm框架,支持多种数据库。 xorm能通过标记灵活的将golang数据结构和数据库字段进行映射,官方文档中支持将JSON和TEXT进行转换,但是文档写的不是很清楚。本文对此作测试并进行记录,帮助用户理清头绪。

测试环境

xorm: v1.0.1 golang: 1.13.0 windows amd64 mysq: 5.7.0

测试代码

  1. struct: (TYPE,JSON,NAME)

代码:

```Go
package function

import (
    "testing"

    "xorm.io/xorm"
)

type TblTestStructTJN struct {
    Id   int64  `xorm:"pk autoincr INT(11)"`
    Name string `xorm:"varchar(255) unique"`
    Conf Test   `xorm:"MediumText JSON 'conf'" json:"conf"`
}

func TestOrmJsonTJN(t *testing.T) {
    orm, err := xorm.NewEngine("mysql", dsn)
    if err != nil {
        t.Fatal("[test] xorm.NewEngine error:", err)
    }
    defer orm.Close()
    orm.ShowSQL(true)

    orm.DropTables(&TblTestStructTJN{})
    orm.Sync(&TblTestStructTJN{})
    orm.DropTables(&TblTestStructTJN{})

    //test sync
    err = orm.Sync(&TblTestStructTJN{})
    if err != nil {
        t.Fatal("[test] xorm.Sync error:", err)
    }

    session := orm.NewSession()
    defer session.Close()

    var test TblTestI
    test.Name = "teste"
    test.Conf.Value = "teste insert ok"

    //test insert
    _, err = session.InsertOne(&test)
    if err != nil {
        t.Fatal("[testE] xorm.InsertOne error:", err)
    }

    var getone TblTestStructTJN

    //test get
    exist, err := session.Where(`name=?`, test.Name).Get(&getone)
    if err != nil {
        t.Fatal("[test] xorm.Get error:", err)
    } else if !exist {
        t.Fatal("[test] xorm.Get error: not exist ")
    }
    if getone.Conf.Value != test.Conf.Value {
        t.Fatalf("[test] insert(%v) not equal get(%v)", test.Conf.Value, test.Conf.Value)
    }
    //test update
    getone.Conf.Value = "teste update ok "
    _, err = session.Where(`name=?`, test.Name).Update(&getone)
    if err != nil {
        t.Fatal("[test] xorm.Update error:", err)
    }
}

```

结论: - 可以正常工作 - 类型解释错误,无法识别类型MediumText

  1. struct: (JSON,TYPE,NAME)

代码: ``Go type TblTestStructJTN struct { Id int64xorm:«pk autoincr INT(11)» Name stringxorm:«varchar(255) unique» Conf Testxorm:«JSON MediumText ‘conf’» json:«conf»` }

func TestOrmJsonJTN(t *testing.T) {
    orm, err := xorm.NewEngine("mysql", dsn)
    if err != nil {
        t.Fatal("[test] xorm.NewEngine error:", err)
    }
    defer orm.Close()
    orm.ShowSQL(true)

    orm.DropTables(&TblTestStructJTN{})
    orm.Sync(&TblTestStructJTN{})
    orm.DropTables(&TblTestStructJTN{})

    //test sync
    err = orm.Sync(&TblTestStructJTN{})
    if err != nil {
        t.Fatal("[test] xorm.Sync error:", err)
    }

    session := orm.NewSession()
    defer session.Close()

    var test TblTestStructJTN
    test.Name = "teste"
    test.Conf.Value = "teste insert ok"

    //test insert
    _, err = session.InsertOne(&test)
    if err != nil {
        t.Fatal("[testE] xorm.InsertOne error:", err)
    }

    var getone TblTestStructJTN

    //test get
    exist, err := session.Where(`name=?`, test.Name).Get(&getone)
    if err != nil {
        t.Fatal("[test] xorm.Get error:", err)
    } else if !exist {
        t.Fatal("[test] xorm.Get error: not exist ")
    }
    if getone.Conf.Value != test.Conf.Value {
        t.Fatalf("[test] insert(%v) not equal get(%v)", test.Conf.Value, test.Conf.Value)
    }
    //test update
    getone.Conf.Value = "teste update ok "
    _, err = session.Where(`name=?`, test.Name).Update(&getone)
    if err != nil {
        t.Fatal("[test] xorm.Update error:", err)
    }
}

``` 

结论: - 创建表成功,类型正确 - insert失败: no primary key for col conf

  1. struct: (JSON,EXTENDS,NAME) 结论: 同1
  2. struct: (TYPE,EXTENDS,NAME) 结论: insert失败 Duplicate entry ‘test’ for key
  3. struct: (EXTENDS,TYPE,NAME) 结论: insert失败 Duplicate entry ‘test’ for key
  4. struct: (JSON,NAME) 结论: 同1
  5. struct: (EXTENDS,NAME) 结论: xorm.Sync error: Error 1060: Duplicate column name ‘name’
  6. struct: (EXTENDS) 结论: xorm.Sync error: Error 1060: Duplicate column name ‘name’
  7. struct: (JSON) 结论: 同1
  8. struct: (NAME) 结论: no primary key for col conf
  9. interface{}: (JSON) 结论: error: sql: converting argument $2 type: unsupported type function.Test

结论

  • 对于json结构应当使用JSON修饰
  • 如果结构中和orm表结构结构中有同名变量不能使用extends
  • json标记不能解决类型的问题,即ORM只能生成text类型,如果需要mediumtext或者longtext需要手动修改表结构
  • interface{}类型不能直接用于orm表结构

Comments