将带有 SQLite3 的 Rails 推送到 Heroku 失败 [重复]
Posted
技术标签:
【中文标题】将带有 SQLite3 的 Rails 推送到 Heroku 失败 [重复]【英文标题】:Pushing Rails with SQLite3 to Heroku fails [duplicate] 【发布时间】:2011-04-14 09:41:58 【问题描述】:当我尝试将 Rails 3 应用程序部署到 Heroku 并且在 gems 文件中定义 sqlite3 时,我遇到了与 Heroku deployment issue 中所述相同的情况。
/usr/ruby1.8.7/lib/ruby/gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:64:in `require': 没有要加载的文件 -- sqlite3 (LoadError)
有什么线索吗? ruby-forum 中定义的解决方案有效,我只是想知道为什么。
【问题讨论】:
devcenter.heroku.com/articles/… 【参考方案1】:确保您没有在生产环境中的 Gemfile 中包含 sqlite:
这是对的:
source :gemcutter
gem 'rails'
group :development, :test do
gem 'sqlite3-ruby', :require => 'sqlite3'
end
这是错误的:
source :gemcutter
gem 'rails'
gem 'sqlite3-ruby', :require => 'sqlite3'
【讨论】:
这个错误还有另一个原因:我在 Heroku 上部署的一个 rake 任务中有“require 'sqlite3'”行。并且该行没有被 LoadError 救出。【参考方案2】:SQLite 需要一个永久的可写文件系统。 (即您的程序最终需要访问对特定文件的 POSIX fopen() 和 fwrite() API 调用)。 Heroku does not provide a permanent writable file system。因此,SQLite 3 将无法工作。
【讨论】:
内存数据库呢?那需要一个可写的文件系统吗? 我不知道,但我希望它能够工作。请记住,如果您的 Rails 进程终止,您将丢失所有这些数据。还要记住将内存数据库的句柄放在全局可访问对象的类变量中。【参考方案3】:由于他们的架构,Heroku 只允许 postgres,所以没有安装 sqlite gem。
【讨论】:
【参考方案4】:Heroku 故意不提供 sqlite3,因为这个数据库系统是嵌入式数据库,它与应用程序在同一进程中运行。 Heroku 是分布式环境,这意味着相同的应用程序可以在许多进程中的许多机器上运行。 这将给出多个单独的 sqlite3 实例 - 完全不相关(想象两台机器上有两个隔离的单独 mysql)。
在分布式环境中,至少必须使用“客户端-服务器”集中式数据库,例如:MySQL、PostgreSQL、Oracle。
【讨论】:
然而,就我而言,heroku 足够聪明,可以忽略我的 Gemfile 中用于本地开发的 sqlite gem 引用,并自动切换到生产环境中的 PostgreSQL,而无需我在任何地方明确指定它。它甚至生成自己的 database.yml 生产设置。我想知道为什么约翰会收到上述错误?【参考方案5】:对于更新版本的 Sqlite,您可以改用这个:
group :development, :test do
gem 'sqlite3'
end
这为我解决了问题。
【讨论】:
【参考方案6】:不要忘记删除以下部分
忽略默认的 SQLite 数据库。 /db/*.sqlite3
来自.gitignore
文件。如果您使用“rails new your-application-name”命令,它将使用此声明创建
【讨论】:
【参考方案7】:Heroku 不支持 SQLite。来自 Heroku 文章SQLite on Heroku:
虽然易于使用,但 SQLite 并不打算用作生产级数据库。相反,Heroku 提供生产级 PostgreSQL 数据库即服务。
为什么 SQLite 不适合在 Heroku 上运行?
磁盘支持的存储
SQLite 在内存中运行,并将其数据存储备份到磁盘上的文件中。虽然这种策略非常适合开发,但 Heroku 的 Cedar 堆栈有一个 ephemeral filesystem。您可以对其进行写入,也可以从中读取,但内容会定期清除。如果您要在 Heroku 上使用 SQLite,您将至少每 24 小时丢失一次整个数据库。
即使 Heroku 的磁盘可以持久运行 SQLite,仍然不适合。由于 SQLite 不作为服务运行,每个 dyno 将运行一个单独的运行副本。这些副本中的每一个都需要自己的磁盘支持存储。这意味着为您的应用程序提供动力的每个测功机都会有一组不同的数据,因为磁盘未同步。
您可以将应用配置为在 Postgres 上运行,而不是在 Heroku 上使用 SQLite。
【讨论】:
以上是关于将带有 SQLite3 的 Rails 推送到 Heroku 失败 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
安装sqlite3时发生将rails应用程序推送到Heroku错误,并且Bundler无法继续[重复]
Rails API 将 has_one: 图像从模型项推送到 Cloudinary 但不能