【发布时间】:2015-08-24 21:15:52
【问题描述】:
我有一个名为 Foo_development 的 MySQL 数据库。它有一张表,名为bars。
$ mysql -e 'select * from Foo_development.bars'
+----+-------+---------------+---------------------+---------------------+
| id | name | email | created_at | updated_at |
+----+-------+---------------+---------------------+---------------------+
| 1 | Alice | Alice@bob.com | 2015-08-24 13:45:11 | 2015-08-24 13:45:11 |
+----+-------+---------------+---------------------+---------------------+
我想创建一个使用这个数据库和这个表的 Rails 应用程序。所以我创建了一个应用程序和一个模型:
$ rails new Foo -d mysql
$ cd Foo
$ rails generate model Bar name:string email:string
这一切都很好,尽管在生成模型之前我必须编辑 config/database.yml 以连接到适当的 MySQL 主机。
我尝试运行我的应用但出现错误:
$ rails server
ActiveRecord::PendingMigrationError
Migrations are pending. To resolve this issue, run:
bin/rake db:migrate RAILS_ENV=development
我尝试运行迁移并得到另一个错误:
$ rake db:migrate
== 20150824204923 CreateBars: migrating ===
StandardError: An error has occurred, all later migrations canceled:
Mysql2::Error: Table 'bars' already exists
不知道在这里做什么,所以我尝试了我在 Google 上找到的东西:
$ rake db:migrate:reset
== 20150824204923 CreateBars: migrated (0.0124s) ===
但是现在我所有的数据库数据都不见了:(
$ mysql -e 'select * from Foo_development.bars'
Empty set (0.00 sec)
我应该怎么做才能避免丢失所有数据?
我假设除了rake db:migrate:reset 之外必须有一些命令可以让我在不截断数据库中的表的情况下运行迁移,但我没有找到任何命令。
我确实看过thesequestionsbuttheydon'ttalk关于防止数据丢失,所以这不是重复的。
如果重要的话,Rails 应用程序是在与托管 MySQL 数据库的计算机不同的计算机上运行的。我试图避免导入/导出操作,因为我正在使用的数据库(除了这个简单的例子)有一百万多行,但我想如果这是最快的方法,我愿意这样做。
编辑: 这个question 类似,但它询问 sqlite3 并且答案涉及从外部文件导入数据库(我猜有比这更快/更有效的方法.)
【问题讨论】:
-
嗨@mchenja!你能解决你的问题吗?
-
还没试过;仍然希望有一个不需要导入/导出的解决方案。
-
然后您可以将
db/*文件夹复制到您的新应用中。然后运行一个rails服务器。应该没问题 -
我不确定我是否理解 - 我从哪里得到这个文件夹?没有“旧”应用
-
对不起,我触摸 Foo_development 来自一个 Rails 应用程序。然后我认为@They_Call_Me_Joe 提供了一个很好的解决方案。但是您需要导出/导入。因为你不能直接做。 Rails 需要一个 migrations 表,该表将包含您的数据库的所有版本。除非您手动创建此表,向其中添加内容,并手动创建
schema.rb文件
标签: mysql ruby-on-rails database activerecord