2011-03-26 10 views
5

Tengo un proyecto alojado en Heroku y me gustaría cambiar el valor de inicio de autoincrementación de una tabla. Estoy usando SQLite3 a nivel local y Heroku utiliza PostgreSQL Esto es lo que tengo en la migración:Cambiar los valores de Aumento automático en la migración (PostgreSQL y SQLite3)

class CreateMytable < ActiveRecord::Migration 

    def self.up 
    create_table :mytable do |t| 
     t.text :mytext 
    end 

    case ActiveRecord::Base.connection.adapter_name 
     when 'PostgreSQL' 
     execute 'ALTER SEQUENCE mytable_id_seq RESTART WITH 1000;' 
     when 'SQLite' 
     execute 'update sqlite_sequence set seq = 1000 where name = "mytable";' 
     else 
    end 
    end 

    def self.down 
    drop_table :mytable 
    end 
end 

localmente las carreras de migración, pero SQLite parece ignorar el cambio, funciona en Heroku sin embargo. ¿Qué estoy haciendo mal?

+3

Algo OT, pero que realmente debe configurar PostgreSQL a nivel local, el desarrollo de una base de datos y el despliegue en otro es una receta para la frustración y el pánico llamadas a las 02:00. –

Respuesta

15

Honestamente, no parece que esto pertenezca a una migración. Se podría añadir lo siguiente a un inicializador para hacer un método de la clase base útil de llamar como parte de una tarea, sin embargo:

ActiveRecord::Base.class_eval do 
    def self.reset_autoincrement(options={}) 
    options[:to] ||= 1 
    case self.connection.adapter_name 
     when 'MySQL' 
     self.connection.execute "ALTER TABLE #{self.table_name} AUTO_INCREMENT=#{options[:to]}" 
     when 'PostgreSQL' 
     self.connection.execute "ALTER SEQUENCE #{self.table_name}_id_seq RESTART WITH #{options[:to]};" 
     when 'SQLite' 
     self.connection.execute "UPDATE sqlite_sequence SET seq=#{options[:to]} WHERE name='#{self.table_name}';" 
     else 
    end 
    end 
end 

A continuación, sólo ejecute el siguiente como parte de una tarea o hacia la derecha en la consola:

Mytable.reset_autoincrement(:to => 1000) 

Asegúrate de comprobar esta útil respuesta sobre por qué la sqlite puede no funcionar.

SQLite Reset Primary Key Field

+0

Gracias, esa es una mejor manera de hacerlo. Como quiero que el proceso sea automático, haré una tarea de rake para ello. Por alguna razón, SQLite no funcionaría hasta que cambie la consulta a 'self.connection.execute" UPDATE sqlite_sequence SET seq = # {options [: to]} WHERE name = '# {self.table_name}'; "'. Algo que ver con '% Q' tal vez? – David

+0

Además, la línea PostgreSQL debe ser '... SECUENCIA # {self.table_name} _id_seq ...' – David

+0

Excelente, gracias por las correcciones; Los he agregado a la publicación. – 20man

Cuestiones relacionadas