2012-02-04 10 views
5

Ho un'applicazione che richiede la presenza di una sequenza nel database. Ho una migrazione che esegue le operazioni seguenti:Crea sequenza in migrazione non riflessa nello schema

class CreateSequence < ActiveRecord::Migration 
    def self.up 
    execute "CREATE SEQUENCE sequence" 
    end 

    def self.down 
    execute "DROP SEQUENCE sequence" 
    end 
end 

Ciò non modifica il schema.rb e rompe così rake db:setup. Come posso forzare lo schema a includere la sequenza?

Nota: la sequenza esiste dopo l'esecuzione di rake db:migrate.

+1

Che versione di rotaie e db stai usando? –

+0

@Sergio Postgres 9.0 –

+1

@Kevin - quale versione di Rails stai usando? –

risposta

5

Migrazioni di rails perché puntano a uno schema di tabelle e campi, invece di una rappresentazione database completa che include stored procedure, funzioni, dati seme.

Quando si esegue rake db: setup, questo creerà il db, caricherà lo schema e quindi caricherà i dati seme.

alcune soluzioni da prendere in considerazione:

Choice 1: creare il proprio compito rake che fa queste migrazioni indipendenti della migrazione Rails su/giù. Le Rails Migrations sono solo normali classi e puoi utilizzarle come preferisci. Per esempio:

rake db:create_sequence 

Scelta 2: eseguire la migrazione specifica dopo aver caricato lo schema come questo:

rake db:setup 
rake db:migrate:up VERSION=20080906120000 

Scelta 3: creare la sequenza come dati di semi, perché è essenzialmente fornendo dati (piuttosto che alterazione dello schema).

db/seeds.rb 

Scelta 4 e la mia preferenza personale: corrono le migrazioni fino ad un buon punto di nota, tra cui la sequenza, e salvo che database vuoto. Change rake db: setup per clonare quel database vuoto. Questo è un po 'più complicato e sacrifica alcune funzionalità - avendo tutte le migrazioni reversibili, avendo le migrazioni lavoro in cima a più fornitori di database, ecc. Nella mia esperienza questi sono dei buoni compromessi. Ad esempio:

rake db:fresh #=> clones the blank database, which you store in version control 
2

Tutti i suggerimenti sopra riportati sono positivi. tuttavia, penso di aver trovato una soluzione migliore. sostanzialmente in vostro development.rb mettere

config.active_record.schema_format = :sql 

Per maggiori informazioni visita la mia risposta a questo problema - rake test not copying development postgres db with sequences

0

Scopri i pg_sequencer gemma. Gestisce sequenze Pg per te come desideri. L'unica pecca che posso vedere adesso è che non funziona bene con db/schema.rb - Rails genererà un CREATE SEQUENCE per le tue tabelle con un campo serial e pg_sequencer sarà anche generare una sequenza stessa. (Lavorando per risolverlo.)

Problemi correlati