sql >> Databáze >  >> RDS >> PostgreSQL

postgresql nextval generování existujících hodnot

Existuje reset_pk_sequences! metoda na Adaptér Postgres . Můžete to zavolat a ono to nastaví na max(id) + 1, což je pravděpodobně to, co chcete.

V některých projektech dostávám data ETL dostatečně často, aby to zaručovalo rake úkol, abych to udělal pro všechny modely nebo pro konkrétní model. Zde je úkol - zahrňte ho do nějakého Rakefile nebo do jeho vlastního pod lib/tasks:

desc "Reset all sequences. Run after data imports"
task :reset_sequences, :model_class, :needs => :environment do |t, args|
  if args[:model_class]
    classes = Array(eval args[:model_class])
  else
    puts "using all defined active_record models"
    classes = []
    Dir.glob(RAILS_ROOT + '/app/models/**/*.rb').each { |file| require file }
    Object.subclasses_of(ActiveRecord::Base).select { |c|
      c.base_class == c}.sort_by(&:name).each do |klass|
        classes << klass
      end
  end
  classes.each do |klass|
      next if klass == CGI::Session::ActiveRecordStore::Session && ActionController::Base.session_store.to_s !~ /ActiveRecordStore/

        puts "reseting sequence on #{klass.table_name}"
        ActiveRecord::Base.connection.reset_pk_sequence!(klass.table_name)
    end
end

Nyní to můžete spustit buď pro všechny modely (definované pod RAIS_ROOT/app/models) pomocí rake reset_sequences , nebo pro konkrétní model zadáním názvu třídy.



  1. MySQL InnoDB Fulltextové vyhledávání obsahující e-mailovou adresu

  2. mysql_fetch_array vrátí pouze jeden řádek

  3. MySql dotaz BETWEEN two Strings někdy nefunguje

  4. Dotaz read_sql vrací prázdný datový rámec poté, co předám parametry jako dict v python pandas