使用 Rails PostgreSQL 中的迁移将旧字符串值转换为日期时间

Bur*_*men 6 postgresql datetime ruby-on-rails

我在数据库表中有几个日期字段,但是它们首先作为字符串启动,而不是日期时间。因此,我想通过迁移将这些值类型更改为日期类型,

class ChangeDateColumnsToDateTime < ActiveRecord::Migration
  def change
    change_column :users, :flight_date_departure, :datetime
    change_column :users, :flight_date, :datetime
    change_column :users, :appointment_date, :datetime
  end
end
Run Code Online (Sandbox Code Playgroud)

但是它不能将旧的字符串值转换为当前存在于数据库中的日期时间,说 PG::DatatypeMismatch: ERROR: column "flight_date_departure" 不能自动转换为没有时区的类型时间戳。提示:您可能需要指定“USING flight_date_departure::timestamp without time zone”。我们在 SQLite 数据库中做到了没有问题,但是 PostgreSQL 存在这个问题。如何修改我的迁移,以便我不会丢失旧值并将它们正确转换为日期时间?

Jaq*_*ias 7

我试过下面的方法,它就像一个魅力:

change_column :table_name, :column_name, 'timestamp USING CAST(column_name AS timestamp)'
Run Code Online (Sandbox Code Playgroud)

  • 这对我在 Rails 5.2 上的 postgres 有用,谢谢! (2认同)

小智 6

试试这样:

change_column :table_name, :column_name, 'datetime USING CAST(column_name AS datetime)'
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用`ActiveRecord::StatementInvalid: PG::UndefinedObject: ERROR: type "datetime" does not exist` (5认同)