Как сбросить одну таблицу в rails?



Я хочу, чтобы значения первичного ключа, чтобы начать снова с 1.

568   10  

10 ответов:

чтобы сбросить индекс / первичный ключ в SQLite просто введите:

$ rails console
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'yourtablename'")

многие люди (как я) приходят сюда, чтобы найти Как удалить все данные в таблице. Здесь вы идете:

$ rails console

> ModelName.delete_all

или

> ModelName.destroy_all

destroy_all проверяет зависимости и обратные вызовы, и занимает немного больше времени. delete_all является прямой SQL-запрос.

дополнительная информация здесь:http://apidock.com/rails/ActiveRecord/Base/delete_all/class

я использовал следующее из консоли rails, чтобы удалить все в таблице, а затем сбросить счетчик индекса (Ruby 2 & Rails 4):

> ModelName.delete_all
> ActiveRecord::Base.connection.reset_pk_sequence!('plural_model_name')

ссылка@khelll полезна. Команда, которую вы хотите усечь одну таблицу:

ActiveRecord::Base.connection.execute("TRUNCATE #{table_name}")

добавить gem 'database_cleaner' к вашему Gemfile, run $ bundle install и затем:

> DatabaseCleaner.clean_with(:truncation, :only => ['yourtablename'])

вы можете указать больше таблиц:

> DatabaseCleaner.clean_with(:truncation, :only => ['table1', 'table2', 'table3'])

если вы оставите последний параметр, он будет усекать всю базу данных:

> DatabaseCleaner.clean_with(:truncation) # your database is truncated

Я использую Rails 4.2.0 и Sqlite3

вот что сработало для меня (взяв немного из всего вышесказанного):

$ rails c
> ModelName.delete_all
> ActiveRecord::Base.connection.execute("DELETE from sqlite_sequence where name = 'table_name'")

затем я смог добавить новые записи в свою таблицу с индексом, начиная с 1

Так как рельсы 4.2 вы можете использовать truncate непосредственно на подключение ActiveRecord:

ActiveRecord::Base.connection.truncate(:table_name)

этой уничтожит все данные и сброс счетчиков автоувеличение в таблице. Работает в MySQL и Postgres,не работа в Sqlite.

Я не думаю, что вы можете сделать это. Однако вы могли бы напишите свою собственную задачу грабли

для вашей информации, вы можете получить список рейк задач, доступных, выполнив:

rake --tasks

вы получите что-то вроде:

rake backups:clear             # Cleanup Backup files
rake clear                     # Cleanup temporary, log and backup files
rake db:fixtures:load          # Load fixtures into the current environment's database.  Load specific fixtures using FIXTURES=x,y
rake db:migrate                # Migrate the database through scripts in db/migrate. Target specific version with VERSION=x
rake db:schema:dump            # Create a db/schema.rb file that can be portably used against any DB supported by AR
rake db:schema:load            # Load a schema.rb file into the database
rake db:sessions:clear         # Clear the sessions table
rake db:sessions:create        # Creates a sessions table for use with CGI::Session::ActiveRecordStore
rake db:structure:dump         # Dump the database structure to a SQL file
rake db:test:clone             # Recreate the test database from the current environment's database schema
rake db:test:clone_structure   # Recreate the test databases from the development structure
rake db:test:prepare           # Prepare the test database and load the schema
rake db:test:purge             # Empty the test database
rake doc:app                   # Build the app HTML Files
rake doc:clobber_app           # Remove rdoc products
rake doc:clobber_plugins       # Remove plugin documentation
rake doc:clobber_rails         # Remove rdoc products
rake doc:plugins               # Generate documation for all installed plugins
rake doc:rails                 # Build the rails HTML Files
rake doc:reapp                 # Force a rebuild of the RDOC files
rake doc:rerails               # Force a rebuild of the RDOC files
rake log:clear                 # Truncates all *.log files in log/ to zero bytes
rake rails:freeze:edge         # Lock to latest Edge Rails or a specific revision with REVISION=X (ex: REVISION=4021) or a tag with TAG=Y (ex: TAG=rel_1-1-0)
rake rails:freeze:gems         # Lock this application to the current gems (by unpacking them into vendor/rails)
rake rails:unfreeze            # Unlock this application from freeze of gems or edge and return to a fluid use of system gems
rake rails:update              # Update both configs, scripts and public/javascripts from Rails
rake rails:update:configs      # Update config/boot.rb from your current rails install
rake rails:update:javascripts  # Update your javascripts from your current rails install
rake rails:update:scripts      # Add new scripts to the application script/ directory
rake stats                     # Report code statistics (KLOCs, etc) from the application
rake test                      # Test all units and functionals
rake test:functionals          # Run the functional tests in test/functional
rake test:integration          # Run the integration tests in test/integration
rake test:plugins              # Run the plugin tests in vendor/plugins/**/test (or specify with PLUGIN=name)
rake test:recent               # Test recent changes
rake test:uncommitted          # Test changes since last checkin (only Subversion)
rake test:units                # Run the unit tests in test/unit
rake tmp:assets:clear          # Clears all files in tmp/test/assets
rake tmp:cache:clear           # Clears all files and directories in tmp/cache
rake tmp:clear                 # Clear session, cache, and socket files from tmp/
rake tmp:create                # Creates tmp directories for sessions, cache, and sockets
rake tmp:pids:clear            # Clears all files in tmp/pids
rake tmp:sessions:clear        # Clears all files in tmp/sessions
rake tmp:sockets:clear         # Clears all files in tmp/sockets

через

посмотреть здесь, вам все еще может потребоваться небольшая настройка для усечения определенной таблицы.

для тех, кто ищет ответ на этот вопрос, когда база данных Postgres, вы можете сделать это из консоли Rails:

rails console
irb(main):028:0> ActiveRecord::Base.connection.execute("SELECT SETVAL('accounts_id_seq', 1)")

здесь accounts на accounts_id_seq - имя таблицы.

Comments

    Ничего не найдено.