### Column属性定义
我们在field对应的Tag中对Column的一些属性进行定义,定义的方法基本和我们写SQL定义表结构类似,比如:
~~~
type User struct {
Id int64
Name string `xorm:"varchar(25) notnull unique 'usr_name'"`
}
~~~
对于不同的数据库系统,数据类型其实是有些差异的。因此xorm中对数据类型有自己的定义,基本的原则是尽量兼容各种数据库的字段类型。对于使用者,一般只要使用自己熟悉的数据库字段定义即可。
具体的Tag规则如下,另Tag中的关键字均不区分大小写,但字段名根据不同的数据库是区分大小写:
| Tag | 说明 |
| -- | -- |
| name | 当前field对应的字段的名称,可选,如不写,则自动根据field名字和转换规则命名,如与其它关键字冲突,请使用单引号括起来。 |
| pk | 是否是Primary Key,如果在一个struct中有多个字段都使用了此标记,则这多个字段构成了复合主键,单主键当前支持int32,int,int64,uint32,uint,uint64,string这7种Go的数据类型,复合主键支持这7种Go的数据类型的组合。 |
| 当前支持30多种字段类型,详情参见本文最后一个表格 | 字段类型 |
| autoincr | 是否是自增 |
| [not ]null 或 notnull | 是否可以为空 |
| unique或unique(uniquename) | 是否是唯一,如不加括号则该字段不允许重复;如加上括号,则括号中为联合唯一索引的名字,此时如果有另外一个或多个字段和本unique的uniquename相同,则这些uniquename相同的字段组成联合唯一索引 |
| index或index(indexname) | 是否是索引,如不加括号则该字段自身为索引,如加上括号,则括号中为联合索引的名字,此时如果有另外一个或多个字段和本index的indexname相同,则这些indexname相同的字段组成联合索引 |
| extends | 应用于一个匿名成员结构体或者非匿名成员结构体之上,表示此结构体的所有成员也映射到数据库中,extends可加载无限级 |
| - | 这个Field将不进行字段映射 |
| -> | 这个Field将只写入到数据库而不从数据库读取 |
| <- | 这个Field将只从数据库读取,而不写入到数据库 |
| created | 这个Field将在Insert时自动赋值为当前时间 |
| updated | 这个Field将在Insert或Update时自动赋值为当前时间 |
| deleted | 这个Field将在Delete时设置为当前时间,并且当前记录不删除 |
| version | 这个Field将会在insert时默认为1,每次更新自动加1 |
| default 0或default(0) | 设置默认值,紧跟的内容如果是Varchar等需要加上单引号 |
| json | 表示内容将先转成Json格式,然后存储到数据库中,数据库中的字段类型可以为Text或者二进制 |
另外有如下几条自动映射的规则:
* 1.如果field名称为`Id`而且类型为`int64`并且没有定义tag,则会被xorm视为主键,并且拥有自增属性。如果想用`Id`以外的名字或非int64类型做为主键名,必须在对应的Tag上加上`xorm:"pk"`来定义主键,加上`xorm:"autoincr"`作为自增。这里需要注意的是,有些数据库并不允许非主键的自增属性。
* 2.string类型默认映射为`varchar(255)`,如果需要不同的定义,可以在tag中自定义,如:`varchar(1024)`
* 3.支持`type MyString string`等自定义的field,支持Slice, Map等field成员,这些成员默认存储为Text类型,并且默认将使用Json格式来序列化和反序列化。也支持数据库字段类型为Blob类型。如果是Blob类型,则先使用Json格式序列化再转成[]byte格式。如果是[]byte或者[]uint8,则不做转换二十直接以二进制方式存储。具体参见 [Go与字段类型对应表](http://gobook.io/read/github.com/go-xorm/manual-zh-CN/chapter-02/5.types.md)
* 4.实现了Conversion接口的类型或者结构体,将根据接口的转换方式在类型和数据库记录之间进行相互转换,这个接口的优先级是最高的。
~~~
type Conversion interface {
FromDB([]byte) error
ToDB() ([]byte, error)
}
~~~
* 5.如果一个结构体包含一个Conversion的接口类型,那么在获取数据时,必须要预先设置一个实现此接口的struct或者struct的指针。此时可以在此struct中实现`BeforeSet(name string, cell xorm.Cell)`方法来进行预先给Conversion赋值。
下表为xorm类型和各个数据库类型的对应表:
| xorm | mysql | sqlite3 | postgres | remark |
| -- | -- | -- | -- | -- |
| BIT | BIT | INTEGER | BIT | |
| TINYINT | TINYINT | INTEGER | SMALLINT | |
| SMALLINT | SMALLINT | INTEGER | SMALLINT | |
| MEDIUMINT | MEDIUMINT | INTEGER | INTEGER | |
| INT | INT | INTEGER | INTEGER | |
| INTEGER | INTEGER | INTEGER | INTEGER | |
| BIGINT | BIGINT | INTEGER | BIGINT | |
| CHAR | CHAR | TEXT | CHAR | |
| VARCHAR | VARCHAR | TEXT | VARCHAR | |
| TINYTEXT | TINYTEXT | TEXT | TEXT | |
| TEXT | TEXT | TEXT | TEXT | |
| MEDIUMTEXT | MEDIUMTEXT | TEXT | TEXT | |
| LONGTEXT | LONGTEXT | TEXT | TEXT | |
| BINARY | BINARY | BLOB | BYTEA | |
| VARBINARY | VARBINARY | BLOB | BYTEA | |
| DATE | DATE | NUMERIC | DATE | |
| DATETIME | DATETIME | NUMERIC | TIMESTAMP | |
| TIME | TIME | NUMERIC | TIME | |
| TIMESTAMP | TIMESTAMP | NUMERIC | TIMESTAMP | |
| TIMESTAMPZ | TEXT | TEXT | TIMESTAMP with zone | timestamp with zone info |
| REAL | REAL | REAL | REAL | |
| FLOAT | FLOAT | REAL | REAL | |
| DOUBLE | DOUBLE | REAL | DOUBLE PRECISION | |
| DECIMAL | DECIMAL | NUMERIC | DECIMAL | |
| NUMERIC | NUMERIC | NUMERIC | NUMERIC | |
| TINYBLOB | TINYBLOB | BLOB | BYTEA | |
| BLOB | BLOB | BLOB | BYTEA | |
| MEDIUMBLOB | MEDIUMBLOB | BLOB | BYTEA | |
| LONGBLOB | LONGBLOB | BLOB | BYTEA | |
| BYTEA | BLOB | BLOB | BYTEA | |
| BOOL | TINYINT | INTEGER | BOOLEAN | |
| SERIAL | INT | INTEGER | SERIAL | auto increment |
| BIGSERIAL | BIGINT | INTEGER | BIGSERIAL | auto increment |
- xorm
- 创建Orm引擎
- 定义表结构体
- 名称映射规则
- 前缀映射,后缀映射和缓存映射
- 使用Table和Tag改变名称映射
- Column属性定义
- 表结构操作
- 获取数据库信息
- 表操作
- 创建索引和唯一索引
- 同步数据库结构
- 导入导出SQL脚本
- SqlMap及SqlTemplate模板
- 初始化SqlMap配置文件及SqlTemplate模板
- SqlMap及SqlTemplate相关功能API
- SqlMap配置文件及SqlTemplate模板加密存储及解析
- 手动管理SqlMap配置及SqlTemplate模板
- 插入数据
- ORM方式插入数据
- 执行SQL命令插入数据
- 创建时间Created
- 查询和统计数据
- ORM方式查询和统计数据
- 查询条件方法
- 临时开关方法
- Get方法
- Find方法
- Join的使用
- Iterate方法
- Count方法
- Rows方法
- Sum系列方法
- Exist方法
- 子查询
- 执行SQL查询
- 执行SQL查询的11种常用方式
- 查询返回json或xml字符串
- 链式查询据操返回某条记录的某个字段的值
- SqlTemplateClient执行过程
- 关于数据库分页查询
- 更新数据
- ORM方式更新数据
- Update方法
- 乐观锁Version
- 更新时间Updated
- 执行SQL命令更新数据
- 删除数据
- ORM方式删除数据
- Delete方法
- 软删除Deleted
- 执行SQL命令删除数据
- 事务处理
- 简单事务模型
- 嵌套事务模型
- 八种事务类型及事务传播机制
- 简单事务相关API
- 嵌套事务相关API
- 嵌套事务示例代码
- 主从数据库(Master/Slave)读写分离
- 创建引擎组
- 负载策略
- 引擎组其他配置方法
- 数据库读写分离
- 批量混合SQL操作
- SQL Builder
- 缓存
- 事件
- 数据导出
- Dump数据库结构和数据
- 查询结果集导出csv、tsv、xml、json、xlsx、yaml、html
- 多Sheet页数据导出
- 日志
- 连接池
- xorm 工具
- 常见问题
- 感谢支持