如何编写Postgresql的向下迁移,其中向上迁移会添加枚举值?

时间:2018-05-08 10:15:02

标签: postgresql enums database-migration

我想通过添加新的枚举值来扩展我的枚举类型。这非常简单。我还将所有SQL保留在迁移中,并使用对称向下迁移将每个迁移配对,从而将模式恢复到先前的状态。

但是,反向操作 - 从枚举中删除变体 - is not supported

围绕这个的常见方法是什么?我可以看到两个选项:

  1. 使用if not exists子句编写“up”迁移,并在“down”迁移中不执行任何操作。我不喜欢这个选项,因为它违反了应用和恢复迁移使模式处于以前状态的假设。
  2. 在“向下”迁移中转换为新的枚举类型,如上面链接的问题所述 - 对于这样一个简单的操作来说似乎有些过分。

1 个答案:

答案 0 :(得分:2)

您无法迁移ENUM。您的意见和评估是100%正确的。

  

我不喜欢此选项,因为它违反了以下假设:应用和还原迁移会使架构保持与以前相同的状态。

如果这是一个挂断,则该选项不在图片中。因为你是对的。

  

对于这样一个简单的操作,似乎有些矫kill过正。

这是因为从ENUM删除值不是简单的操作。那么,为什么将具有更多值的ENUM迁移到具有更少值的DB::select('SELECT bldgs.name as building , floors.name as floor, areas.name as area, locations.area_id ,count(reqs.location_id) as occupied FROM `reqs` ' . 'JOIN locations ON locations.id = location_id ' . 'JOIN areas ON areas.id = area_id ' . 'JOIN floors ON floors.id = areas.floor_id' . ' JOIN bldgs ON bldgs.id = bldg_id ' . 'WHERE `status`=2 and (DATE_FORMAT(start_date,"%Y-%m")<= "'.$dateFrom.'" AND DATE_FORMAT(end_date,"%Y-%m")>="'.$dateTo.'") group by locations.area_id, areas.name, floors.name, bldgs.name' ); 呢?

听马,

  

另一个很好的例子,为什么枚举通常不是一个好主意。如果您使用带有外键的标准查找表,这将非常容易。删除值就像运行DELETE语句一样简单 – a_horse_with_no_name