v2.8版本开始, 如果时间字段created_atupdated_atdeleted_at为布尔字段,ORM组件会自动识别支持,并写入布尔类型数值(写入数值通过01表示)。 通常布尔字段为deleted_at字段,我们这里只演示deleted_at字段类型为bool的情况。

示例SQL

这是后续示例代码中用到的MySQL表结构。

  1. CREATE TABLE `user` (
  2. `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  3. `name` varchar(45) NOT NULL,
  4. `status` tinyint DEFAULT 0,
  5. `created_at` int(10) unsigned DEFAULT NULL,
  6. `updated_at` int(10) unsigned DEFAULT NULL,
  7. `deleted_at` bit(1) DEFAULT NULL,
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我们建议使用bit(1)来表示字段的bool类型,而非tinyint(1)或者int(1)。因为tinyint(1)/int(1)字段类型表示的范围是-127~127,通常可能会被用作状态字段类型。而bit(1)的类型范围为0/1,可以很好的表示bool类型的两个值false/true

时间维护-布尔字段 - 图1提示

如果您尝试测试查看ORM操作执行的SQL语句,建议您打开debug模式(相关文档:调试模式),SQL语句将会自动打印到日志输出。

created_at 写入时间

  1. // INSERT INTO `user`(`name`,`created_at`,`updated_at`,`deleted_at`) VALUES('john',1731481488,1731481488,0)
  2. g.Model("user").Data(g.Map{"name": "john"}).Insert()

deleted_at 数据软删除

  1. // UPDATE `user` SET `deleted_at`=1 WHERE (`id`=10) AND `deleted_at`=0
  2. g.Model("user").Where("id", 10).Delete()

查询的时候会发生一些变化,例如:

  1. // SELECT * FROM `user` WHERE (id>1) AND `deleted_at`=0
  2. g.Model("user").Where("id>?", 1).All()