使用Active Record structure.sql与Heroku

时间:2016-03-31 02:04:27

标签: mysql ruby-on-rails-4 heroku

我有一个带有MySQL 5.6数据库的Rails 4.2.5应用程序。这个MySQL数据库有许多外键,视图和函数。 Schema.rb旨在与数据库无关,因此无法支持修改这些附加模式对象所需的特定于数据库的命令,因此提供了structure.sql功能。

http://edgeguides.rubyonrails.org/active_record_migrations.html#schema-dumping-and-you

不幸的是,MySQL的内置结构转储任务不包括过程,触发器或外键。这对我们的团队来说是个问题,因为我们必须手动控制这些“非标准”对象。因此,我决定找到一种解决方案,允许使用迁移来管理整个数据库模式。我在Pivotol Labs的这篇精彩文章中登陆。

https://blog.pivotal.io/labs/labs/using-mysql-foreign-keys-procedures-and-triggers-with-rails

namespace :db do
  namespace :structure do |schema|
    schema[:dump].abandon
    desc 'OVERWRITTEN - shell out to mysqldump'
    task dump: :environment do
      config = ActiveRecord::Base.configurations[Rails.env]
      filename = "#{Rails.root}/db/structure.sql"
      cmd = "mysqldump -u#{config['username']} -p#{config['password']} "
      cmd += '-d --routines --triggers --skip-comments '
      cmd += "#{config['database']} > db/structure.sql"
      system cmd
      File.open(filename, 'a') do |f|
        f << ActiveRecord::Base.connection.dump_schema_information
      end
    end
  end

  desc 'load the development_structure file using mysql shell'
    task load: :environment do
      config = ActiveRecord::Base.configurations[Rails.env]
      cmd = "mysql -u#{config['username']} -p#{config['password']} "
      cmd += "#{config['database']} < db/structure.sql"
      system cmd
    end
  end

  namespace :test do |schema|
    schema[:clone_structure].abandon
    desc 'OVERWRITTEN - load the development_structure file using mysql shell'
    task clone_structure: %w(db:structure:dump db:test:purge) do
      config = ActiveRecord::Base.configurations['test']
      cmd = "mysql -u#{config['username']} -p#{config['password']} "
      cmd += "#{config['database']} < db/structure.sql"
      system cmd
    end
  end
end

通过从shell中使用mysqldump,我可以生成一个包含所有模式对象的structure.sql文件。

目前我的主要问题是Heroku我无法找到mysql转储。我安装了这个提供MySQL二进制文件的buildpack。

https://github.com/gaumire/heroku-buildpack-mysql

但是我收到了错误

  

mysqldump:找不到

运行heroku run rake db:migrate

正如你所看到的,我在这里的兔子洞已经很糟糕了。我怀疑即使我能正确找到mysqldump,Heroku的只读文件系统也会出现问题。也许我应该绕过我覆盖的rake db:structure:dump任务中的非开发环境,因为structure.sql应该包含一个在我所有环境中都一致的模式,所以也许我可以逃避不尝试在生产中写入它?

如果有人设法解决此问题或使用Active Record迁移管理完整MySQL架构的替代方法,我将非常感谢您的意见。

1 个答案:

答案 0 :(得分:0)

您可以通过运行heroku run bash -a <myapp>来解决此问题,heroku run rake db:migrate将在一次性dyno中启动bash shell,其环境与运行mysqldump时的环境相同。

Heroku的文件系统不是只读的,它们是“短暂的”。您可以在dyno中创建/更改文件,但是当dyno终止时这些更改会丢失,因此更改不会持续存在,因此只要您可以找到def POST(self): f = open('tmp','wb') cherrypy.request.rfile.bufsize = 1024 * 1024 * 5 #adjust buffer size here while True: cherrypy.request.rfile._fetch(); #reading data if cherrypy.request.rfile.closed: #end of stream checking break buffer = cherrypy.request.rfile.buffer #your data is here cherrypy.request.rfile.buffer = "" #clearing buffer f.write(buffer) #consume it f.close() return "done" 二进制文件,此方法就可以正常工作。