我有一个带有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架构的替代方法,我将非常感谢您的意见。
答案 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"
二进制文件,此方法就可以正常工作。