2012-02-04 9 views
5

Tengo una aplicación que requiere una secuencia para estar presente en la base de datos. Tengo una migración que hace lo siguiente:Crear secuencia en migración no reflejada en el esquema

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

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

Esto no modifica el schema.rb y por lo tanto rompe rake db:setup. ¿Cómo puedo obligar al esquema a incluir la secuencia?

Nota: La secuencia existe después de ejecutar rake db:migrate.

+1

¿Qué versión de rieles y db estás usando? –

+0

@Sergio Postgres 9.0 –

+1

@Kevin - ¿qué versión de Rails estás usando? –

Respuesta

5

Rails Migraciones porque apuntan a un esquema de tablas y campos, en lugar de una representación completa de la base de datos que incluye procedimientos almacenados, funciones, datos de inicialización.

Cuando ejecuta rake db: setup, esto creará la base de datos, cargará el esquema y luego cargará los datos de inicialización.

Algunas soluciones para que usted considere:

Choice 1: crear su propia tarea rastrillo que hace estas migraciones independientes de la migración rieles hacia arriba/abajo. Las migraciones de Rails son solo clases normales, y puedes hacer uso de ellas como quieras. Por ejemplo:

rake db:create_sequence 

Opción 2: ejecutar la migración específica después de cargar el esquema de la siguiente manera:

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

Opción 3: crear su secuencia de datos de semillas, ya que está proporcionando básicamente los datos (en lugar de alterando el esquema).

db/seeds.rb 

opción 4 y mi preferencia personal: se ejecutan las migraciones hasta un punto bueno conocido, incluyendo su secuencia, y salvo que la base de datos en blanco. Cambiar rake db: setup para clonar esa base de datos en blanco. Esto es un poco más complicado y sacrifica algunas capacidades: hacer que todas las migraciones sean reversibles, hacer que las migraciones funcionen sobre múltiples proveedores de bases de datos, etc. En mi experiencia, estos son buenos intercambios. Por ejemplo:

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

Mira la joya pg_sequencer. Gestiona secuencias Pg para ti como desees. El único defecto que puedo ver ahora es que no funciona bien con db/schema.rb - Rails generará un CREATE SEQUENCE para sus tablas con un campo serial, y pg_sequencer dará también generará una secuencia. (Trabajando para arreglar eso.)

Cuestiones relacionadas