使用ClearDB插件将基于MySQL的Rails应用程序部署到Heroku

3
我有一个名为“enrollment_app”的Rails应用程序,它使用MySQL种子文件初始化并填充数据库中的所有表格。我构建了该应用程序,添加了一些迁移,并将我的应用程序推送到Heroku。但是,由于Heroku使用Postgres,我需要一种使我的MySQL数据库与Heroku兼容的方法,因此我正在使用ClearDB插件。
当我尝试打开应用程序时,我收到以下消息:
Application Error
An error occurred in the application and your page could not be served. Please try again in a few moments.

If you are the application owner, check your logs for details.

所以,我检查了日志,并看到了这个错误:

PG::UndefinedTable: ERROR:  relation "enrollments" does not exist

我一直在按照这个教程进行操作,但显然我不知道如何使ClearDB看起来像我的本地MySQL DB,因为我收到了上述错误。我该如何做到相当于运行rake db:seed MySQL种子文件和rake db:migrate到生产ClearDB数据库?

更新 - Gemfile:

source 'https://rubygems.org'

gem 'rails', '4.2.1'
gem 'mysql2'
gem 'sass-rails', '~> 5.0'
gem 'uglifier', '>= 1.3.0'
gem 'coffee-rails', '~> 4.1.0'
gem 'jquery-rails'
gem 'turbolinks'
gem 'jbuilder', '~> 2.0'
gem 'sdoc', '~> 0.4.0', group: :doc
gem 'bootstrap-sass', '~> 3.3.5'
gem 'bootswatch-rails'
gem 'ransack'
gem 'jquery-turbolinks'
gem 'kaminari'
gem 'bootstrap-kaminari-views'
gem 'jquery-ui-rails'
gem 'espinita'
gem 'mysqltopostgres', git: "https://github.com/maxlapshin/mysql2postgres.git"

group :development, :test do
  gem 'byebug'
  gem 'web-console', '~> 2.0'
  gem 'spring'
  gem 'rspec-rails'
  gem 'launchy'
  gem 'pry'
  gem 'pry-nav'
  gem 'shoulda-matchers'
  gem 'factory_girl_rails'
  gem 'capybara'
  gem 'newrelic_rpm'
  gem 'poltergeist'
  gem 'database_cleaner'
end

group :production do
  gem 'rails_12factor'
end

PG::UndefinedTable 是 PG(Postgres)宝石中的一个错误。您是否更新了Gemfile以使用mysql gem?请参阅指南的此部分:https://devcenter.heroku.com/articles/cleardb#local-setup - elithrar
是的,我从我的gemfile中删除了pg gem,重新绑定,推送到heroku,然后运行了heroku run rake db:create,但是出现了这个错误:LoadError: cannot load such file -- pg。然后我尝试将heroku数据库url设置为mysql2,在我的heroku日志中发现了这个:Cannot destroy last attachment to billing app for resource dozing-nimbly-2184 - Ben Pritchard
你能发布一下你最新的Gemfile吗? - elithrar
@elithrar,这是它。我刚刚重新添加了“pg”宝石,这样就消除了一个错误。请查看下面建议答案中的我的评论。 - Ben Pritchard
1个回答

3
这不是ClearDB本身的问题,看起来你还没有完全脱离PostgreSQL默认设置。请检查以下内容:
  • 你的Gemfile文件中是否定义了pg?不应该有这个定义,而应确保mysql2已经存在。
  • 你是否为此应用程序安装了Heroku ClearDB插件,并将其设置为应用程序使用的默认数据库?你是否已卸载了Heroku Postgres数据库?完整的说明请参见此处
一旦你的Heroku应用程序能够正确连接到ClearDB数据库,你应该可以轻松地设置数据库本身,没有什么问题。
heroku run rake db:create
heroku run rake db:migrate
heroku run rake db:seed

感谢您的发布,我没有删除我的Heroku Postgres数据库。我刚刚这样做了。然后我通过heroku config:set设置了我的新DB,并在“mysql”后面添加了“2”,因为我的Gemfile使用mysql2。但是当我运行heroku run rake db:create时,我收到错误消息:LoadError: cannot load such file -- pg。我很困惑,因为如果我在项目中搜索“pg”,则会返回0个结果...所以我不确定为什么首先加载了pg文件。我发布了我的Gemfile以帮助解决问题。 - Ben Pritchard
好的,根据其他互联网信息,我将“pg” gem放回了我的Gemfile中,这样就消除了那个错误。它实际上让我成功运行了heroku run rake db:createheroku run rake db:seed(在我的迁移之前运行,我必须在种子之后推送)。但是当我添加迁移文件并运行heroku rake db:migrate时,我会出现这个错误:Mysql2 :: Error:Table'heroku_74f570faead6d61.eligibility_states'不存在:ALTER TABLEeligibility_states``。你知道为什么我的表没有在种子文件中加载(在其中定义)。在开发中工作。)吗? - Ben Pritchard
如果你运行 heroku pg:status 命令,我有一种感觉是你已经在Postgres中创建了那些内容(考虑到你重新添加了gem并且它“工作”了)。 - elithrar
嗯,@BenPritchard,我没有遇到过那个具体的错误,但我强烈认为你不应该在Gemfile中需要pg gem。也许你可以查看调用堆栈以尝试找出哪个文件正在尝试加载pg?我更愿意得到这个问题的答案,而不是因为删除它会导致错误而留下一个不必要的gem;那感觉像是未来维护噩梦的配方。 - Topher Hunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接