xorm JSON结构测试
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
测试代码
- 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
- struct: (JSON,TYPE,NAME)
代码:
``Go
type TblTestStructJTN struct {
Id int64
xorm:«pk autoincr INT(11)»
Name string
xorm:«varchar(255) unique»
Conf Test
xorm:«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
- struct: (JSON,EXTENDS,NAME) 结论: 同1
- struct: (TYPE,EXTENDS,NAME) 结论: insert失败 Duplicate entry ‘test’ for key
- struct: (EXTENDS,TYPE,NAME) 结论: insert失败 Duplicate entry ‘test’ for key
- struct: (JSON,NAME) 结论: 同1
- struct: (EXTENDS,NAME) 结论: xorm.Sync error: Error 1060: Duplicate column name ‘name’
- struct: (EXTENDS) 结论: xorm.Sync error: Error 1060: Duplicate column name ‘name’
- struct: (JSON) 结论: 同1
- struct: (NAME) 结论: no primary key for col conf
- interface{}: (JSON) 结论: error: sql: converting argument $2 type: unsupported type function.Test
结论
- 对于json结构应当使用
JSON
修饰 - 如果结构中和orm表结构结构中有同名变量不能使用
extends
- json标记不能解决类型的问题,即ORM只能生成text类型,如果需要
mediumtext
或者longtext
需要手动修改表结构 interface{}
类型不能直接用于orm表结构