Rails change_column 使用 Postgresql 函数的迁移 - 时间到整数(自午夜以来的秒数)
Rails change_column migration using Postgresql function - time to integer (seconds since midnight)
table orders
有一个数据类型为 time without time zone
的 cuts_off_at
列。这个 table 和专栏已经使用了一段时间,因此 table 有很多保存的记录。我意识到我希望此列的数据类型为 integer
以表示 seconds since midnight
。我应该如何格式化 change_column 行?
我已经尝试了一些不同的东西,但似乎都做不好。我相信这是我最接近的尝试:
change_column :orders, :cuts_off_at, 'INTEGER USING EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_off_at))'
哪个returns错误:
syntax error, unexpected tINTEGER, expecting end
...USING EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_...
版本:
postgres 版本 10.12
rails5.2.4.2
两种迁移方法不是破坏性的,可以让您在直接更新语句中使用 postgres 魔法。它还可以让您确保一切都按预期工作...
def change
rename_column :orders, :cuts_off_at, :cuts_off_at_old
add_column :orders, :cuts_off_at, :integer
execute("UPDATE orders SET cuts_off_at = EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_off_at_old))")
end
然后您可以在以后的迁移中简单地删除旧列...
def change
remove_column :orders, :cuts_off_at_old
end
或者如果你需要一个上下...
def up
rename_column :orders, :cuts_off_at, :cuts_off_at_old
add_column :orders, :cuts_off_at, :integer
execute("UPDATE orders SET cuts_off_at = EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_off_at_old))")
end
def down
remove_column :orders, :cuts_off_at
rename_column :orders, :cuts_off_at_old, :cuts_off_at
end
table orders
有一个数据类型为 time without time zone
的 cuts_off_at
列。这个 table 和专栏已经使用了一段时间,因此 table 有很多保存的记录。我意识到我希望此列的数据类型为 integer
以表示 seconds since midnight
。我应该如何格式化 change_column 行?
我已经尝试了一些不同的东西,但似乎都做不好。我相信这是我最接近的尝试:
change_column :orders, :cuts_off_at, 'INTEGER USING EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_off_at))'
哪个returns错误:
syntax error, unexpected tINTEGER, expecting end
...USING EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_...
版本:
postgres 版本 10.12 rails5.2.4.2
两种迁移方法不是破坏性的,可以让您在直接更新语句中使用 postgres 魔法。它还可以让您确保一切都按预期工作...
def change
rename_column :orders, :cuts_off_at, :cuts_off_at_old
add_column :orders, :cuts_off_at, :integer
execute("UPDATE orders SET cuts_off_at = EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_off_at_old))")
end
然后您可以在以后的迁移中简单地删除旧列...
def change
remove_column :orders, :cuts_off_at_old
end
或者如果你需要一个上下...
def up
rename_column :orders, :cuts_off_at, :cuts_off_at_old
add_column :orders, :cuts_off_at, :integer
execute("UPDATE orders SET cuts_off_at = EXTRACT(epoch from ('2000-01-01 00:00:00'::time - cuts_off_at_old))")
end
def down
remove_column :orders, :cuts_off_at
rename_column :orders, :cuts_off_at_old, :cuts_off_at
end