在迁移中更改自动增量值(PostgreSQL和SQLite3)

Dav*_*vid 5 sql sqlite postgresql auto-increment ruby-on-rails-3

我有一个在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
Run Code Online (Sandbox Code Playgroud)

本地迁移运行但SQLite似乎只是忽略了更改,但它适用于Heroku.我究竟做错了什么?

20m*_*man 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
Run Code Online (Sandbox Code Playgroud)

然后只需在控制台中执行以下操作即可:

Mytable.reset_autoincrement(:to => 1000)
Run Code Online (Sandbox Code Playgroud)

一定要检查这个方便的答案,为什么sqlite可能无法正常工作.

SQLite重置主键字段