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
我这样解决了:
转到冲突的迁移文件.
删除内容并保存.
跑 rake db:migrate
Ctrl + Z文件到以前的状态.
这是一个特例,因为我从另一个应用程序中复制了数据库,并且我有相互冲突的迁移和东西.
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可以回滚数据库的结构更改,从而避免此问题.
默认情况下,会rake db:migrate运行所有挂起的迁移.所以,为了让你的迁移正确..为了那个..com发布那些迁移,然后将它们恢复正常.它将确保您在将来的迁移中没有问题.