将Rails迁移标记为已迁移

Dav*_*ver 16 ruby migration ruby-on-rails

我最终有效地复制了9次迁移.(我认为这是因为我安装/更新了Gems和/或在我的开发和生产机器上进行了迁移,但现阶段并不完全确定.)

我从生产服务器上的rails目录中移出了一组重复的9,但是现在我想要进行db:migrate生产以便运行另一个迁移,我得到:

$ bundle exec rake db:migrate RAILS_ENV=production
[DEPRECATION WARNING] Nested I18n namespace lookup under "activerecord.attributes.checkout" is no longer supported
==  CreatePages: migrating ====================================================
-- create_table(:pages)
rake aborted!
An error has occurred, all later migrations canceled:

Mysql2::Error: Table 'pages' already exists: CREATE TABLE `pages` (`id` int(11) DEFAULT NULL auto_increment PRIMARY KEY, `title` varchar(255), `body` text, `slug` varchar(255), `created_at` datetime, `updated_at` datetime) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)

这是因为迁移已经有效地运行了.

我宁愿避免这样做db:migrate:down,并db:migrate:up为每一个-我认为这将意味着在生产数据库中的数据丢失.(在这种情况下,Spree中有几个静态页面.)

有没有办法可以告诉Rails的这个安装忘记所有未完成的迁移,有效地标记所有未完成的迁移?

Zeq*_*uez 17

我这样解决了:

  1. 转到冲突的迁移文件.

  2. 删除内容并保存.

  3. rake db:migrate

  4. Ctrl + Z文件到以前的状态.

这是一个特例,因为我从另一个应用程序中复制了数据库,并且我有相互冲突的迁移和东西.

  • 想添加一个澄清:不要删除整个内容.只需删除类声明和结束之间的所有内容.由于文件名和类名不匹配,删除所有内容将导致此错误:http://stackoverflow.com/questions/17776900/error-on-dbmigrate-uninitialized-constant-devisecreateusers (4认同)

Bha*_*caz 12

您还可以在 Rails 控制台中使用ActiveRecord::SchemaMigration模型将时间戳添加到 schema_migrations 表中。

ActiveRecord::SchemaMigration.create! version: '20210724133241'
Run Code Online (Sandbox Code Playgroud)


Sha*_*ald 11

您可以将迁移的时间戳添加到schema_migrations表.但是,为什么数据库中缺少该表或缺少它需要的行?

很可能是这种特定的迁移已经中途完成并失败了,因此当您尝试再次运行它时,迁移的第一部分将无法像以前那样工作.这是MySQL的一个限制,因为它无法回滚部分失败的迁移更改.另一方面,Postgres可以回滚数据库的结构更改,从而避免此问题.

  • 在这种情况下,您只需要进行gem安装,或者更好地使用Gemfile中提到的gem并使用bundler来安装gem库.第一次设置rake脚本只需要在gem首次添加到项目时运行一次. (2认同)

San*_*ing 9

默认情况下,会rake db:migrate运行所有挂起的迁移.所以,为了让你的迁移正确..为了那个..com发布那些迁移,然后将它们恢复正常.它将确保您在将来的迁移中没有问题.