Ruby on rails 在Rails中重新创建表
我正在使用Rails和Postgres。我目前创建了一个Like表。我需要删除此表并重新创建它。这是我到目前为止所做的 1) 将Ruby on rails 在Rails中重新创建表,ruby-on-rails,ruby,postgresql,Ruby On Rails,Ruby,Postgresql,我正在使用Rails和Postgres。我目前创建了一个Like表。我需要删除此表并重新创建它。这是我到目前为止所做的 1) 将create_likes迁移文件重命名为create_likes\u old,这样迁移中的文件名就不会冲突 2) 将迁移中的表名从create\u table:likes更改为create\u table:likes\u old 3) 生成新的create_likes迁移,创建一个名为Like的表 当前,我在运行rake db时遇到了以下问题:migrate: PG::
create_likes
迁移文件重命名为create_likes\u old
,这样迁移中的文件名就不会冲突
2) 将迁移中的表名从create\u table:likes
更改为create\u table:likes\u old
3) 生成新的create_likes
迁移,创建一个名为Like的表
当前,我在运行rake db时遇到了以下问题:migrate:
PG::DuplicateTable: ERROR: relation "likes" already exists
这使得like表似乎从未重命名为LikeOld。出了什么问题以及如何解决此问题?旧迁移在您更改其内容时不会运行,您不应该重命名它们。即使它们确实运行了,将
create_table:likes
更改为create_table:old_likes
也不可能更改现有表的名称。这不是create\u table
所做的。在最好的情况下,重新运行该迁移将导致创建一个名为old_likes
的新表,该表没有任何内容,而旧的likes
表不受影响。实际上,重新运行该迁移将失败,因为它将首先尝试撤消迁移,删除尚不存在的表old\u likes
您需要做的是创建一个名为rename\u likes\u to\u old\u likes
的新迁移,该迁移实际上使用重命名表。然后,要么:
- 完全删除旧迁移,这样您就可以使用相同的名称引入新迁移
- 创建一个具有唯一名称的新迁移,例如
或类似名称,并在那里介绍您的新表create\u new\u likes\u table
rake db:migrate:redo VERSION=
显式地重新运行该迁移,否则更改旧迁移将完全无效。如果您尝试为您描述的迁移运行该迁移,它将失败,因为它将首先尝试删除一个名为old\u likes
的表,它还不存在。@SergioTulentsev否,数字后面的字符串必须是唯一的。您不能有名为001\u stuff.rb
和002\u stuff.rb
的迁移,\u stuff
必须是唯一的。我请您自己试试。@SergioTulentsev问题是迁移名称直接映射到它定义的类create\u stuff
必须定义一个名为CreateStuff
的迁移类。两个同名的迁移必然会定义同一个类,这会让事情变得一团糟。后一个类将破坏前一个类的方法,或者可能会导致第一个类定义up/down
,第二个类定义change
产生一些奇怪的未定义行为。Rails通过在迁移名称上强制唯一性来避免这种混乱。