Rails无法使用NOW()默认值创建迁移到Postgres

127*_*127 6 migration postgresql timestamp ruby-on-rails

我使用它的常用方法是

psql > ALTER TABLE transactions ALTER COLUMN date SET DEFAULT CURRENT_TIMESTAMP\g

它工作正常.

在我的RoR应用程序中,我试图以两种方式创建迁移.

1.

class TransactionsSetDefaultDateChange < ActiveRecord::Migration
  change_column :transactions, :date, :datetime, :null=>false, :default=>'CURRENT_TIMESTAMP'
end
Run Code Online (Sandbox Code Playgroud)

2.

class TransactionsSetDefaultDateChange < ActiveRecord::Migration
 execute <<-SQL
    ALTER TABLE transactions ALTER COLUMN date SET DEFAULT CURRENT_TIMESTAMP
 SQL
end
Run Code Online (Sandbox Code Playgroud)

都失败了.有什么想法吗?

PS这种情况适用于迁移("rake db:migrate"),但未在"rake db:setup"上正确应用(丢失SQL语句)

class TransactionsSetDefaultDateChange < ActiveRecord::Migration
 def change
 execute <<-SQL
    ALTER TABLE transactions ALTER COLUMN date SET DEFAULT CURRENT_TIMESTAMP
 SQL
 end
end
Run Code Online (Sandbox Code Playgroud)

der*_*rek 10

对于Rails 5+,现在可以使用了

... null: false, default: -> { 'NOW()' } ...
Run Code Online (Sandbox Code Playgroud)

在Postgresql Modifiers中生成类似的东西

not null default now()
Run Code Online (Sandbox Code Playgroud)

  • 注意,“从10/15开始”表示Rails 5和更高版本。Rails 4中不存在此功能。请参阅:https://github.com/rails/rails/pull/20005 (2认同)

bui*_*der 7

你的问题和答案让我走了.使用Rails 4.2.4和Postgres 9.3,以下迁移代码对我有用:

    create_table :goodies do |t|
      t.datetime :last_read_at, null: false
    end
    execute "ALTER TABLE goodies ALTER COLUMN last_read_at SET DEFAULT CURRENT_TIMESTAMP"
Run Code Online (Sandbox Code Playgroud)

它产生了一段有效的SQL:

    last_read_at timestamp without time zone NOT NULL DEFAULT now(),
Run Code Online (Sandbox Code Playgroud)