我有一个在Heroku上托管的项目,并希望更改表的自动增量起始值。我在本地使用SQLite3而Heroku使用PostgreSQL这就是我在迁移中所拥有的:
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。我做错了什么?
答案 0 :(得分:15)
老实说,这听起来并不属于迁移。您可以将以下内容添加到初始化程序中,以便将一个方便的Base类方法作为任务的一部分进行调用,但是:
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可能无法正常工作的原因。