所以我刚刚开始了一个ruby项目,我对rails非常陌生。我想在我的应用程序中创建两个模型; Words
(如'自行车')和Wordtypes
(如'名词')。我首先通过脚手架生成Word模型。
$ rails g scaffold Word word_name:string word_type_name:string
$ rake db:migrate
然后我提醒自己,最好不要使用word_type_name
并且最好使用word_type_id
,这样我就可以与包含wordtype引用的另一个数据库进行通信。 。
然后我跑:
$ rails destroy scaffold Word
$ rake db:migrate
我重新创造了整个事物:
$ rails g scaffold Word word_type_id:integer word_id:integer word_name:string
$ rake db:migrate
我想检查一切是否正确,所以我运行rails控制台:
$ rails console
Loading development environment (Rails 3.2.11)
>> Word
=> Word(id: integer, word_name: string, word_type: string, created_at: datetime, updated_at: datetime)
为什么旧款还在这里?我忘了忘记过去的事吗?
我已经阅读了一点,似乎忘了重置数据库。所以现在我用:
$ rake db:reset
缺点是现在我尝试迁移所有内容时出现此错误:
$ rake db:migrate
== CreateWords: migrating ====================================================
-- create_table(:words)
rake aborted!
An error has occurred, this and all later migrations canceled:
SQLite3::SQLException: table "words" already exists: CREATE TABLE "words" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "word_type_id" integer, "word_id" integer, "word_name" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) /Library/Ruby/Gems/1.8/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:91:in `initialize'
即使我读了一些文档(http://guides.rubyonrails.org/migrations.html#resetting-the-database),rake db:reset
也应删除所有旧表。有谁知道这里发生了什么?
答案 0 :(得分:2)
这里的问题是您销毁了脚手架Word但没有恢复迁移,因此旧表已经在数据库中创建并且没有丢弃。
现在你又重新生成了脚手架。但是他的新脚手架的迁移将无法运行,因为名为words的表已经存在:
您将无法使用迁移删除表单词,因为它在销毁脚手架时已被删除。
如果您不想放弃所有数据,那么您可以运行:
bundle exec rake db:drop db:create db:migrate
它将通过新的更改再次设置您的数据库。
或者如果您不想在其他表格中丢失数据,则采用其他方式,
使用项目目录中终端的数据库控制台从数据库中删除表:
rails dbconsole
>> drop table words;
>> exit
bundle exec rake db:migrate
答案 1 :(得分:2)
正常流量
rails g scaffold Word word_name:string word_type_name:string
创建控制器,视图,模型,迁移文件
rake db:migrate
这是一个rake任务,它将运行db / migrate /中的ruby文件代码,并相应地设置数据库。在您的情况下,这会创建一个words
表,其中包含word_name
和word_type
列。
现在,当您意识到自己在脚手架中出错时,需要先恢复数据库状态。所以,运行
rake db:rollback
这将撤消上次迁移,在您的情况下,迁移正在创建包含列的表words
。然后你可以用
rails destroy scaffold Word
这会破坏所有文件(视图,模型,迁移)。
然后你可以继续你的新脚手架,
$ rails g scaffold Word word_type_id:integer word_id:integer word_name:string
$ rake db:migrate
在你的国家
在编辑中,您使用了命令
rake db:reset
这只会重置数据库中的值,即如果您有
之类的值<强> DB 强>
Words
id name type
1) Bike, noun
2) Car, noun
rake db:reset
会像这样重置数据库中的所有值
<强> DB 强>
Words
id name type
您实际需要的是销毁列,如果您有创建它的迁移文件,则可以轻松运行rake db:rollback
寻找上次迁移,迁移文件以撤消操作。
我认为你应该刚刚启动了这个项目,所以你可以使用命令rake db:drop
删除数据库,这会破坏所有表。
<强> DB 强>
empty
然后运行将运行所有迁移的rake db:migrate
答案 2 :(得分:2)
您可以使用以下命令回滚数据库:
bundle exec rake db:migrate VERSION=0
注意:您将丢失所有数据。
之后,更改您的迁移并运行:
bundle exec rake db:migrate
生成新的数据库架构。