【问题标题】:Create Rails App With Existing MySQL Database Without Losing Data使用现有 MySQL 数据库创建 Rails 应用程序而不会丢失数据
【发布时间】: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


【解决方案1】:

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

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

`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

确保通过rake 或sql syntax删除数据库。

打开文件output.sql并添加在你的`db/seeds.rb``中以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

【讨论】:

  • 我确实尝试过这个,但不幸的是 seed_dump gem 不会跟踪每个模型的 id。 Issue on GitHub
  • 好吧,看看我的 edit ...如果它有效。我将删除答案的第一部分……编辑之前的部分。我确实更喜欢 seed_dump gem 不要跟踪我的 id 号码。
  • 我实际上认为你的答案的两个部分都很有用,所以如果我是你,我不会删除任何内容。但我会试试看!
【解决方案2】:

一个简单的选择是将您的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
);

【讨论】:

    【解决方案3】:

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

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

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

    https://github.com/tilo/smarter_csv

    【讨论】:

      【解决方案4】:

      由于只有一张表,最简单的方法是备份数据库。创建应用,创建新的迁移,然后从备份中恢复表。

      【讨论】:

        猜你喜欢
        • 2015-09-22
        • 1970-01-01
        • 1970-01-01
        • 2013-08-03
        • 2017-03-20
        • 1970-01-01
        • 2021-10-09
        • 1970-01-01
        • 2012-05-24
        相关资源
        最近更新 更多