2011-03-26 60 views
5

我有一個託管在Heroku上的項目,並且希望更改表的自動增量開始值。我在本地使用的SQLite3和Heroku的使用PostgreSQL的這是我在遷移:更改遷移中的自動​​增量值(PostgreSQL和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 

本地遷移運行,但SQLite的似乎只是忽略的變化,它的工作原理在Heroku雖然。我究竟做錯了什麼?

+3

有點OT,但你真的應該建立本地的PostgreSQL,在一個數據庫上開發和部署的另一個是對挫折的配方,並在02:00驚慌失措的電話。 – 2011-03-26 06:22:12

回答

15

說實話,這聽起來不像是屬於遷移。你可以添加以下的初始化,使一個方便的基類方法作爲任務的一部分調用,但:

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 

然後只需運行下面爲控制檯任務或右的部分:

Mytable.reset_autoincrement(:to => 1000) 

一定要檢查這個方便的答案,爲什麼sqlite可能不工作。

SQLite Reset Primary Key Field

+0

謝謝,這是一個更好的方法。因爲我想讓這個過程自動化,所以我會爲它做一個耙子任務。出於某種原因,儘管SQLite不會工作,直到我將查詢更改爲'self.connection.execute「UPDATE sqlite_sequence SET seq =#{options [:to]}其中name ='#{self.table_name}';」'。可能與'%Q'有關? – David 2011-03-26 10:48:15

+0

另外,PostgreSQL行應該是'... SEQUENCE#{self.table_name} _id_seq ...' – David 2011-03-26 11:23:17

+0

非常好,感謝您的更正;我已將它們添加到帖子中。 – 20man 2011-03-26 16:46:25