sql >> Databasteknik >  >> RDS >> PostgreSQL

I en Rails-migrering, hur ställer jag in standardvärdet för en kolumn till NOW() istället för tiden då jag körde migreringen?

Det är inte väldokumenterat men du kan ange en lambda som standardvärde i en migrering och det kommer att göra det rätta. Om du säger så här:

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

då kommer kolumnens standardvärde att sättas till now() och databasfunktionen now() anropas inte förrän ett standardvärde behövs för kolumnen. Sedan om du \d stratum_worker_submissions i psql du kommer att se:

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

som önskat. Alla andra standardvärden kommer att utvärderas när migreringen körs och du kommer att få en fast tidsstämpel som standard.

Alternativt kan du alltid göra det för hand med 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

Observera att om du börjar ändra schemat manuellt med SQL kan du börja göra saker som inte visas i db/schema.rb eftersom du snabbt kan komma in i SQL som ActiveRecord inte förstår. Om det händer kan du ändra från db/schema.rb till db/structure.sql genom att ändra config/application.rb :

config.active_record.schema_format = :sql

och ersätter sedan db/schema.rb med db/structure.sql i revisionskontroll och med db:structure rake-uppgifter istället för det vanliga db:schema uppgifter.




  1. DISTINCT med två array_agg (eller en array_agg med tupel inuti)?

  2. Självhanterande PostgreSQL-partitionstabeller

  3. lsnrctl starta rane när jag avfyrar det här kommandot detta fel kommer

  4. Använder JShell i Java 9 i NetBeans 9.0, del 4