使用现有MySQL数据库创建Rails应用程序而不丢失数据

时间:2015-08-24 21:15:53

标签: mysql ruby-on-rails database activerecord

我有一个名为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之外必须有一些命令允许我在不截断数据库中的表的情况下运行迁移,但我还没找到。

我确实关注了防止数据丢失的these questions but they don't talk,因此这不是重复。< / p>

如果重要,Rails应用程序的运行程序与承载MySQL数据库的计算机不同。我试图避免导入/导出操作,因为我正在使用的数据库(在这个简单的例子之外)有一百万+行,但我想我愿意这样做,如果这样做&& #39;是最快的方法。

编辑:question类似,但它询问sqlite3,答案涉及从外部文件导入数据库(我猜测那里&#39; sa更快/更有效的方式。)

3 个答案:

答案 0 :(得分:1)

在您的第一个Rails应用(旧版)中,您可以在Gemfile中添加gem seed_dump https://github.com/rroblak/seed_dump,然后bundle install

然后在rake db:seed:dump db:drop中运行,它会将您的数据库内容转储到db/seed.rb文件中,这也会丢弃您的数据库。然后,您可以将此文件复制并粘贴到db/seed.rb下的新Rails应用中。

`rake db:create`#create the db (database.yml)
`rake db:migrate db:seed`

因此,最后您将重新创建具有相同内容的数据库。 Notes如果您只想要一个表格,则可以使用rake db:seed:dump MODELS=Bar

修改

首先检查您的计算机上是否安装了mysqldump程序

which mysqldump

如果是,那么

mysqldump your_database_name > output.sql

在你的rails应用

rake db:drop db:create db:migrate

确保您rakesql syntax 删除数据库。

使用以下语法在您的`db / seeds.rb``中打开文件output.sql添加INSERT INTO bars....开头的行。

sql = "INSERT INTO `friendly_id_slugs` VALUES (3,'abram-s-commitment-to-a-life-of-faith',1,'Book',NULL,'2015-08-27 01:50:39'),(4,'what-aileth-thee',2,'Book',NULL,'2015-08-27 01:50:39');"

ActiveRecord::Base.connection.execute(sql)

请注意,您可能需要修改sql变量才能使用正确的apostrophe ' or "。您也可以rails c -s手动执行上述代码,看看它是否适用于sandbox console

然后终于

rake db:seed

答案 1 :(得分:1)

一个简单的选项是将CreateBars迁移版本号放入schema_migrations表。

看起来导致问题的迁移文件可能名为db/migrate/20150824204923_create_bars.rb,对吗?

所以你可以在你的数据库中完成这个,因为表已经存在了:

INSERT INTO schema_migrations(version) VALUES('20150824204923');

哦,我想你可能也需要创建schema_migrations表,因为Rails可能还没有这样做:

CREATE TABLE IF NOT EXISTS schema_migrations(
  version VARCHAR NOT NULL
);

答案 2 :(得分:0)

我会将数据库中的表导出为.csv文件,具体取决于语言,框架等,您使用它的方式不同。

然后,您可以从该csv文件中填充rails应用程序中的数据库种子。

有几个宝石可以做到这一点,请在下面找到一个很棒的宝石:

https://github.com/tilo/smarter_csv