sql >> Databáze >  >> RDS >> PostgreSQL

Jak v migraci Rails nastavím výchozí hodnotu sloupce na NOW() namísto času, kdy jsem spustil migraci?

Není to dobře zdokumentováno, ale můžete zadat lambda jako výchozí hodnotu při migraci, což udělá správnou věc. Pokud řeknete toto:

def change
  change_column_default :stratum_worker_submissions, :created_at, -> { 'now()' }
end

pak bude výchozí hodnota sloupce nastavena na now() a databázová funkce now() nebude volána, dokud nebude pro sloupec vyžadována výchozí hodnota. Pak pokud \d stratum_worker_submissions v psql uvidíte:

created_at | timestamp without time zone | not null default now()

podle přání. Jakékoli jiné výchozí nastavení bude vyhodnoceno při spuštění migrace a skončíte s pevným časovým razítkem jako výchozím.

Případně to můžete vždy provést ručně pomocí SQL:

def up
  connection.execute(%q(
    alter table stratum_worker_submissions
    alter column created_at
    set default now()
  ))
end
def down
  connection.execute(%q(
    alter table stratum_worker_submissions
    alter column created_at
    drop default
  ))
end

Pamatujte, že pokud začnete ručně měnit schéma pomocí SQL, můžete začít dělat věci, které se neobjeví v db/schema.rb jak se můžete rychle dostat do SQL, kterému ActiveRecord nerozumí. Pokud k tomu dojde, můžete to změnit z db/schema.rb na db/structure.sql změnou config/application.rb :

config.active_record.schema_format = :sql

a poté nahrazením db/schema.rb s db/structure.sql v kontrole revizí a pomocí db:structure úlohy rake namísto obvyklých db:schema úkoly.




  1. SQL dotaz s průměrem a seskupit podle

  2. Pokus o pesimistický zámek JPA nikdy nevyprší

  3. %ENV nefunguje a nemohu použít sdílenou knihovnu

  4. PHP PDO Připravený příkaz vázat hodnotu NULL