ruby 如何解决Rails 7中的挂起迁移错误

pcww981p  于 12个月前  发布在  Ruby
关注(0)|答案(3)|浏览(114)

我创建了一个迁移,其中我错误地复制了“created_at”列,现在我的屏幕显示此错误,当我删除重复后,错误也是相同的删除重复之前。
这是终端消息:

PS C:\Users\iamvee_k\Desktop\Rails Projects\blog> rails db:migrate
== 20231003192318 AddTimestampsToArticles: migrating ==========================
-- add_column(:articles, :created_at, :datetime)
rails aborted!
StandardError: An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: duplicate column name: created_at
C:/Users/iamvee_k/Desktop/Rails Projects/blog/db/migrate/20231003192318_add_timestamps_to_articles.rb:3:in `change'

Caused by:
ActiveRecord::StatementInvalid: SQLite3::SQLException: duplicate column name: created_at
C:/Users/iamvee_k/Desktop/Rails Projects/blog/db/migrate/20231003192318_add_timestamps_to_articles.rb:3:in `change'

Caused by:
SQLite3::SQLException: duplicate column name: created_at
C:/Users/iamvee_k/Desktop/Rails Projects/blog/db/migrate/20231003192318_add_timestamps_to_articles.rb:3:in `change'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)

这是输出屏幕:

zphenhs4

zphenhs41#

如果您使用create_table,例如

create_table :saving_transactions do |t|
  t.integer :value_in_cents

  t.timestamps
end

t.timestamps将为您创建created_atupdated_at字段,因此将其保留在那里,但删除您手动添加的额外created_at
当你这样做的时候,你有两个选择:
1.如果你不在乎丢失你拥有的数据,你可以使用rails db:reset。这将删除数据库并再次运行迁移(因此在运行命令之前,请确保修复了额外的created_ at的问题)
1.如果你不想丢失数据,你可以使用rails db:rollback。它将回滚上次迁移,您可以使用STEP传递您想要的步骤(在您的情况下是1,但您不需要传递它)。然后再次运行rails db:migrate
举例来说:

rails db:rollback STEP=3 # => Rollsback 3 migrations

更多信息:https://guides.rubyonrails.org/active_record_migrations.html#rolling-back

ikfrs5lh

ikfrs5lh2#

您没有显示迁移文件,但是如果您在原始迁移中看到行t.timestamps,则created_at已经与updated_at一起沿着创建。
如果不需要同时使用created_atupdated_at,则删除该行并显式定义其中一个,例如t.datetime :created_at
更改迁移后,请执行以下操作(将擦除本地数据):

rake db:drop
rake db:create
rake db:migrate

在本地,您不需要担心回滚或所有这些事情。把数据库清空重新开始。在本地,这是好的,因为这是种子数据的重点,是不断重新播种您的应用程序,每次更改迁移时都要擦除和清除数据库。没有理由在应用程序尚未启动时继续添加迁移文件
如果你在生产中遇到这个问题,那么我总是手工编辑数据库,因为我讨厌数百个不必要的迁移。
因此,在生产环境中,我基本上会在本地提交我想要的迁移更改,并在心里记下它们。然后在GUI中打开我的生产数据库,并按照我认为合适的方式修改它们,使它们与同一GUI中数据库的本地外观相匹配。这对于较小的应用程序来说是很好的,它们不需要复杂的每次更改的审计日志。

wtzytmuj

wtzytmuj3#

您已经创建了新的迁移,但尚未迁移到您的数据库,因此只需使用

bundle exec rails db:migrate

如果上面的命令不起作用,则使用rake db:migrate

相关问题