使用现有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
);