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

使用现有MySQL数据库创建Rails应用程序而不丢失数据,mysql,ruby-on-rails,database,activerecord,Mysql,Ruby On Rails,Database,Activerecord,我有一个名为Foo\u development的MySQL数据库。它有一个表,名为bar $ mysql -e 'select * from Foo_development.bars' +----+-------+---------------+---------------------+---------------------+ | id | name | email | created_at | updated_at | +----+

我有一个名为
Foo\u development
的MySQL数据库。它有一个表,名为
bar

$ 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
我不知道该怎么做,所以我尝试了在谷歌上找到的东西:

$ rake db:migrate:reset

== 20150824204923 CreateBars: migrated (0.0124s) ===
但现在我所有的数据库数据都消失了:(

我应该做些什么来避免丢失所有数据?

我假设除了
rake db:migrate:reset
之外,还必须有一些命令,允许我运行迁移而不截断数据库中的表,但我没有找到任何命令

我确实研究了如何防止数据丢失,因此这不是重复

如果有关系的话,Rails应用程序运行的计算机与托管MySQL数据库的计算机不同。我试图避免导入/导出操作,因为我正在使用的数据库(除了这个简单的示例)有超过一百万行,但如果这是最快的方法,我想我愿意这样做


编辑:这是类似的,但它询问sqlite3,答案涉及从外部文件导入数据库(我猜有一种更快/更有效的方法。)

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

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

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


由于只有一个表,最简单的方法是对数据库进行备份。创建应用程序,创建新迁移,然后从备份中还原表。

在第一个Rails应用程序(旧的)中,您可以在gem文件中添加gem
种子转储
,然后
捆绑安装

然后运行
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`
因此,在最后,您可以使用相同的内容重新创建一个db。
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语法
删除数据库

使用以下语法打开文件
output.sql
并添加
INSERT-INTO-bar开头的行….

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
变量以使用适当的
撇号或“
。您也可以
rails c-s
并手动执行上述代码,以查看它是否在
沙盒控制台上工作

最后

rake db:seed

一个简单的选项是将您的
createbar
迁移版本号放入
schema\u migrations
表中

看来引起问题的迁移文件可能名为
db/migrate/20150824204923_create\u bars.rb
,对吗

因此,您可以在数据库中执行此操作,因为表已经存在:

INSERT INTO schema_migrations(version) VALUES('20150824204923');
哦,我想您可能也需要创建
schema\u migrations
表,因为Rails可能也没有这样做:

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

您好@mchenja!您能解决您的问题吗?尚未尝试;仍然希望找到一个不需要导入/导出的解决方案。然后您可以将
db/*
文件夹复制到新应用程序。然后运行rails服务器。应该可以了。我不确定我是否理解-我从哪里获得此文件夹?没有“旧”文件夹"appsorry I touch Foo_development来自rails应用程序。然后我认为@They_Call_Me_Joe提供了一个很好的解决方案。但是您需要导出/导入。因为您无法直接完成。rails需要一个迁移表,该表将包含数据库的所有版本。除非您手动创建此表,否则请向其添加内容并创建一个数据库lso手动创建一个
schema.rb
文件我确实尝试过这个,但不幸的是
seed\u dump
gem没有跟踪每个模型的id。好的,看看我的编辑…如果可以的话。我会删除我答案的第一部分…编辑之前的那部分。我确实希望seed\u dump gem不跟踪我的id号。我实际上认为这两部分都是如果你的答案有用,那么如果我是你,我不会删除任何内容。但我会尝试!
CREATE TABLE IF NOT EXISTS schema_migrations(
  version VARCHAR NOT NULL
);