Изменение значений автоинкремента при миграции (PostgreSQL и SQLite3) - PullRequest
5 голосов
/ 26 марта 2011

У меня есть проект, размещенный на 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.Что я делаю не так?

1 Ответ

15 голосов
/ 26 марта 2011

Честно говоря, не похоже, что это относится к миграции. Вы можете добавить следующее в инициализатор, чтобы сделать удобный метод базового класса для вызова как часть задачи:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...