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

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

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

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

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

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

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

有时候我们的 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 任务

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

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

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

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

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

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

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

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

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

ActiveRecord::Base.establish_connection

content.gsub(/^--.*$/, '').split(/;$/).collect(&:strip).reject(&:empty?).each |sql|
  ActiveRecord::Base.connection.execute sql
end
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册