Rails db/migrate/seeds.rb 如何导入.sql 文件到mysql数据库?

xufeng · 发布于 2011年12月10日 · 最后由 tracyzhang 回复于 2015年03月10日 · 4899 次阅读
336

db/migrate/seeds.rb 如何导入.sql 文件到mysql数据库?

如果用mysql 语句导入,

mysql -u root -p blog_development < db/tag.sql

在运行rake db:migrate时,有时会发现 rake abort 的错误,rake说blog_development表已经存在,因此这个migrate的工作它干不了。这个表确实是已经存在的(用mysql命令导入的),那么如何让rake跳过这个表,或是强制覆写这个表呢?

http://www.iteye.com/topic/143152 搜索了很久, 在create_table的参数中,加上 :force => true即可。

但是,实际情况,每次导入数据成功后,执行rake db:migrate 命令,原来的数据又给清零了,导入的数据库没有数据了!郁闷啊?高手求答案!! @huacnlee

共收到 14 条回复
96

rake db:seeds 才会执行db/migrate/seeds.rb中的代码

336

seeds.rb 如何写代码导入.sql数据库啊

96

我自己没用过,不过你可以试试

ActiveRecord::Base.establish_connection
ActiveRecord::Base.connection.execute(sql)
336

有时候我们的Rails应用是在已有数据库上的,我们需要把基于SQL的schema转化成ActiveRecord的schema 1,dump schema 运行rake db:schema:dump来将数据库中的表结构复制到db/schema.rb文件中 这时运行rake db:schema:load或者将schema.rb的内容copy到一个migration中并运行rake db:migrate会生成表 其中:force => true表示会覆盖数据库已存在的表,这样会让我们丢失数据库已有的data 2,migration的版本 Rails会自动生成schema_info表,该表的version列表示当前的migration的version,即migration文件开头的number 可以修改schema_info的version来控制要执行的migrate任务 3,避免丢失数据 一种方式是先从数据库extract fixtures,然后rake db:schema:load或rake db:migrate,并且:force => true,然后rake db:fixtures:load 另一种方式是修改schema_info的version来控制要执行的migrate任务

132

system("mysql -uroot -p xxxx < xx.sql")

96

用 system("mysql -u root -p blog_development < db/tag.sql") 是个办法

336

#8楼 @alvin2ye system("mysql -uroot -p xxxx < xx.sql") 这个要写道seed.rb里面吗?@wxianfeng

求具体代码? 菜鸟一枚啊!

336

system("mysql -u root -p blog_development < db/tag.sql") 这个具体怎么用啊? 求帮助啊!!!

96

如果你一定要 xxx.sql 导入的话

cmd = "mysql -uroot -ppwd blog_development < #{Rails.root}/xxx.sql"
res = `#{cmd}`
336

#11楼 @alvin2ye 这个代码加入到seed.rb 吗?

186

#3楼 @cqpx 这个得按分号分开了一条一条执行,默认是不让执行多条语句的

ActiveRecord::Base.establish_connection

content.gsub(/^--.*$/, '').split(/;$/).collect(&:strip).reject(&:empty?).each |sql|
  ActiveRecord::Base.connection.execute sql
end
17178

#1楼 @Richie rake db:seed

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册