如何重置轨道中的单个表?

我想要主键值从1开始。

要重置SQLite中的索引/主键,只需键入:

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

很多人(像我)来这里find如何删除表中的所有数据。 干得好:

 $ rails console > ModelName.delete_all 

要么

 > ModelName.destroy_all 

destroy_all检查依赖关系和callback,并花费更长的时间。 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 gem 'database_cleaner'添加到您的Gemfile中,运行$ 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'") 

然后,我可以添加新的logging到我的表,索引从1开始

我不认为你能做到这一点。 但是,你可以写自己的耙子任务

有关您的信息,可以通过执行以下操作获取可用的rake任务列表:

 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 

通过

看看这里 ,你仍然可能需要一些定制来截断一个特定的表。

由于Rails 4.2可以直接在ActiveRecord连接上使用truncate

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

这将擦除所有数据重置表中的自动增量计数器 。 在MySQL和Postgres 工作,在Sqlite中不起作用。

对于在数据库是Postgres的时候寻找这个问题的答案的其他人,你可以从Rails控制台执行:

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

accounts中的accounts_id_seq是表的名称。