推SQLite3的轨道Heroku失败

当我尝试将我的Rails 3应用程序部署到Heroku,并且在gems文件中定义了sqlite3时,我遇到了与Heroku部署问题中描述的相同的情况。

/usr/ruby1.8.7/lib/ruby/gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:64:in`require':no such file to load – sqlite3(LoadError)

任何线索为什么这是? 在ruby论坛的作品定义的解决scheme,我只是想知道为什么。

确保在生产环境中不要在您的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' 

SQLite需要一个永久可写的文件系统。 (即你的程序最终需要访问对特定文件的POSIX fopen()和fwrite()API调用)。 Heroku不提供永久的可写文件系统 。 因此,SQLite 3将无法正常工作。

由于他们的架构,Heroku只允许postgres,所以没有安装sqlite gem。

因为这个数据库系统是与应用程序运行在相同的进程中的embedded式数据库,所以我在北极有意不提供sqlite3。 Heroku是一个分布式环境,意味着同一个应用程序可以在多个进程内运行在许多机器上 这将给多个分离的sqlite3实例 – 完全不相关(想象在两台机器上两个孤立的单独的mysqls)。

在分布式环境中,至less必须使用“客户端 – 服务器”集中式数据库,例如:MySQL,PostgreSQL,Oracle。

对于更新的Sqlite版本,您可以使用它来代替:

 group :development, :test do gem 'sqlite3' end 

这为我修好了。

不要忘记删除以下部分

忽略默认的SQLite数据库。
/db/*.sqlite3

.gitignore文件。 如果您使用“rails new your-application-name”命令,则使用此声明创build它

Heroku不支持SQLite。 从Heroku文章SQLite的Heroku :

虽然易于使用,但SQLite不是作为生产级数据库。 相反,Heroku提供生产级的PostgreSQL数据库作为服务。

为什么SQLite不适合在Heroku上运行?

磁盘备份的存储

SQLite在内存中运行,并将其数据存储备份到磁盘上的文件中。 虽然这个策略对于开发很有效,但Heroku的Cedar栈有一个短暂的文件系统 。 你可以写信给它,你可以从中读取,但内容将被定期清除。 如果您要在Heroku上使用SQLite,则至less每24小时会丢失一次整个数据库。

即使Heroku的磁盘持续运行,SQLite仍然不太适合。 由于SQLite不作为服务运行,所以每个dyno将运行一个单独的运行副本。 每个副本都需要自己的磁盘备份存储。 这意味着每个驱动你的应用程序的dyno将有不同的数据集,因为磁盘不同步。

而不是在Heroku上使用SQLite,你可以configuration你的应用程序在Postgres上运行。