Heroku和Datamapper问题

时间:2011-06-26 21:49:35

标签: ruby sqlite heroku sinatra datamapper

我可以在Heroku上启动一个基本应用程序,显示带有'/'的消息......工作得很好。但是,每当我尝试使用datamapper添加sqlite时,事情就会崩溃。

要查看我的应用结构,请查看github上的项目。我保持代码很简单。

在来自heroku的日志中我得到了:

2011-06-26T21:28:36+00:00 app[web.1]: /app/.bundle/gems/ruby/1.9.1/gems/dm-core-1.1.0/lib/dm-core/adapters.rb:163:in `require': no such file to load -- dm-postgres-adapter (LoadError)

关于这一点的是我没有使用postgres,所以我很困惑为什么会这样说。

3 个答案:

答案 0 :(得分:9)

“关于这一点的是我没有使用postgres,所以我很困惑为什么会说这个。”

你正在使用Heroku,所以 使用Postgresql。

在你的app.rb中,你有这一行:

DataMapper::setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/notes.db")

我猜你是从the Heroku database docs得到的。这行基本上是说“检查环境变量'DATABASE_URL',如果设置它,则使用它作为数据库url,否则使用Sqlite url”。在本地运行此环境变量将不会被设置,因此您将使用Sqlite网址,但在Heroku上,这将设置为类似的内容(请参阅上面链接的页面):

postgres://username:password@hostname/database

Datamapper会看到这是一个Postgresql网址,并尝试要求没有安装的postgres适配器,因此会导致您看到的错误。

最好的解决方案是在本地安装Postgresql,以便您的开发和生产环境尽可能相似。如果您不能这样做,或者不想这样做,您可以在本地指定Sqlite适配器,并在生产中指定Postgres适配器。它在Gemfile中看起来像这样:

group :development do
  gem 'dm-sqlite-adapter'
end

group :production do
  gem 'dm-postgres-adapter'
end

如果你这样做,你需要告诉Heroku在安装宝石时要忽略哪些组,请参阅Heroku Gem Bunder docs

答案 1 :(得分:2)

您正在从sqlite迁移到postgres-sql,因此您应该在Gemfile中包含dm-postgres-adapter(并安装它)。

答案 2 :(得分:2)

Heroku仅支持read-only file system(或者至少仅支持您希望持久化的任何文件的只读操作)。因此,您不能在Heroku上使用SQLite。 Heroku仅支持PostgreSQL作为数据库,因此您需要配置DataMapper以使用PostgreSQL(参见Yet Another Geek's answer)。

如果您计划部署到Heroku,我建议您在开发环境中安装PostgreSQL。每个数据库都有一点不同,没有ORM可以保护您免受差异的影响。如果你在一个数据库上开发但在另一个数据库上部署,那么对questions tagged heroku and postgresql进行一些搜索应该会显示出一些问题。