sql >> Database >  >> RDS >> PostgreSQL

Hoe stel ik in een Rails-migratie de standaardwaarde van een kolom in op NU() in plaats van het tijdstip waarop ik de migratie heb uitgevoerd?

Het is niet goed gedocumenteerd, maar je kunt een lambda als standaardwaarde in een migratie opgeven en dat zal het juiste doen. Als je dit zegt:

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

dan wordt de standaardwaarde van de kolom ingesteld op now() en de databasefunctie now() wordt pas aangeroepen als er een standaardwaarde voor de kolom nodig is. Als je dan \d stratum_worker_submissions in psql je zult zien:

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

zoals gewenst. Elke andere standaardwaarde wordt geëvalueerd wanneer de migratie wordt uitgevoerd en u krijgt standaard een vast tijdstempel.

U kunt het ook altijd handmatig doen met 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

Houd er rekening mee dat als u het schema handmatig met SQL gaat wijzigen, u mogelijk dingen gaat doen die niet in db/schema.rb verschijnen omdat u snel in SQL kunt komen dat ActiveRecord niet begrijpt. Als dat gebeurt, kun je veranderen van db/schema.rb naar db/structure.sql door config/application.rb . te wijzigen :

config.active_record.schema_format = :sql

en dan db/schema.rb te vervangen met db/structure.sql in revisiebeheer en het gebruik van de db:structure rake taken in plaats van de gebruikelijke db:schema taken.




  1. Oracle 10g:MIN/MAX kolomwaarde schatting

  2. Hoe kan ik een link een willekeurige php-ID op de pagina laten laden?

  3. Ik moet een zeer interessante query schrijven die null-waarden en rijen met waarden berekent

  4. Postgres-beperking die ervoor zorgt dat één kolom van vele aanwezig is?