结构体示例:
```go
type CsTable struct {
Id int64 `xorm:"pk autoincr"`
Name string `xorm:"varchar(40) notnull unique"`
Type string `xorm:"varchar(40)"`
Remark string `xorm:"varchar(1024)"`
}
```
根据此结构体建表代码
```go
err = engine.Sync2(new(CsTable))
```
运行后用Navicat查看新建的表
![image.png](https://static.golangjob.cn/221122/d87a1ad4f1e4979decdd0440967a54d0.png)
**为什么字段类型与长度与结构体定义不符?**
尝试用gorm根据结构体建sqlite表,字段类型与长度与结构定义相符合。但是更希望能找到xorm的解决方案。
哪位大佬能帮忙解答一下,感谢!
经过3楼大佬的提醒,对比xorm和gorm建表的语句确实不一样。
xorm
![image.png](https://static.golangjob.cn/221123/ccb5edfe6b0c647b857b7eaee0244dfd.png)
gorm
![image.png](https://static.golangjob.cn/221123/caf4844b1b001197c0a62fad3c01c059.png)
但是按照xorm官方文档中的属性定义介绍,定义的结构体也是没有问题的。
直到看到了官方文档(http://xorm.topgoer.com/chapter-02/4.columns.html)中属性定义中的最后一个表格:
![image.png](https://static.golangjob.cn/221123/f28b42bb8a64c562b1a4c456da01f8b7.png)
猜测可能是xorm严格按照sqlite支持的字段类型将VARCHAR转换成了TEXT,所以建表语句中的类型就变为了TEXT。
仔细查看xorm源代码发现:当数据库为sqlite时根据结构体建表,构造sql语句时会调用SQLType()函数 ,此函数将VARCHAR转换成了TEXT。
![image.png](https://static.golangjob.cn/221123/2fa3156869beeaae5128e19f4a293684.png)
#5
更多评论
看看sqlite支持的类型吧,https://www.runoob.com/sqlite/sqlite-data-types.html
没有varchar吧,都是text代替。
#1
可是如果使用gorm的话是可以的
结构体示例:
```go
type CsTable struct {
Id int64 `gorm:"primarykey"`
Name string `gorm:"type:varchar(40);not null;unique"`
Type string `gorm:"type:varchar(40)"`
Remark string `gorm:"type:varchar(1024)"`
}
```
根据此结构体建表代码
```go
engine.AutoMigrate(&model.CsTable{})
```
运行后用Navicat查看新建的表
![image.png](https://static.golangjob.cn/221122/bfe79cbe846c6c998ae06fa9327cac49.png)
**em这就没有被text代替**
#2