2011-03-26 14 views
5

Heroku'da barındırılan bir projem var ve bir tablonun otomatikleştirme başlangıç ​​değerini değiştirmek istiyorum. Ben yerel olarak SQLite3 kullanıyorum ve Heroku Bu benim göçün ne var PostgreSQL kullanır:Geçişte Autoincrement değerlerini değiştirme (PostgreSQL ve SQLite3)

Yerel
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 

göç ​​çalışır ancak SQLite sadece değişimi görmezden görünüyor olsa Heroku üzerinde çalışır. Neyi yanlış yapıyorum?

+3

Biraz OT ama gerçekten bir veritabanı üzerinde gelişen ve diğerinde dağıtma yerel PostgreSQL kurmalıyım hayal kırıklığı davetiye çıkarıyor ve 02:00 de çağrıları panikledim. –

cevap

15

Dürüst olmak gerekirse, bu bir geçişe ait gibi görünmüyor. Gerçi bir görevin parçası olarak aramak için kullanışlı Bankası sınıf yöntemini yapmak için bir başlatıcısı aşağıdakileri ekleyebilirsiniz:

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 

Sonra sadece konsolda bir görev veya hakkın parçası olarak aşağıdaki çalıştırın:

Mytable.reset_autoincrement(:to => 1000) 

Bu kullanışlı cevabı, sqlite'ın neden çalışmadığı konusunda kontrol ettiğinizden emin olun.

SQLite Reset Primary Key Field

+0

Teşekkürler, bunu yapmanın daha iyi bir yolu. İşlemin otomatikleştirilmesini istediğim için bunun için bir komisyon görevi yapacağım. SQLite, "self.connection.execute" UPDATE sqlite_sequence SET sekme = # {options [: to]} WHERE name = '# {self.table_name}'; ''. % Q' ile ilgili bir şey olabilir mi? – David

+0

Ayrıca, PostgreSQL satırı olmalıdır ... ... SIRALAMA # {self.table_name} _id_seq ... ' – David

+0

Mükemmel, düzeltmeler için teşekkürler; Onları yazıya ekledim. – 20man