将带有SQLite3的Rails应用程序推送到Heroku失败

19

在将我的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论坛中定义的解决方案有效,只是我想知道为什么这样做。


1
https://devcenter.heroku.com/articles/how-do-i-use-sqlite3-for-development - fguillen
7个回答

33

确保在生产环境中不要在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捕获。 - Alexander Kuznetsov

11

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


1
内存数据库怎么样?它需要一个可写文件系统吗? - nicholaides
我不确定,但我认为它应该可以工作。只要记住,如果你的Rails进程死了,你就会失去所有这些数据。还要记得将内存数据库的句柄放在全局可访问对象的类变量中。 - Jay Godse

5
由于Heroku的架构,只允许使用postgres,因此未安装sqlite gem。

4

对于较新版本的Sqlite,您可以使用以下内容:

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

这对我很有帮助。

4
我认为Heroku故意不提供sqlite3,因为这个数据库系统是嵌入式数据库,运行在与应用程序相同的进程中。而Heroku是分布式环境,这意味着同一应用程序可能在许多机器上运行,有许多进程。 这将给出多个分离的sqlite3实例 - 完全无关(想象一下在两台机器上有两个隔离的独立mysql)。
在分布式环境中,至少必须使用“客户端-服务器”集中式类型的数据库,例如:MySQL、PostgreSQL、Oracle。

2
然而,在我的情况下,Heroku 足够聪明,忽略了我在 Gemfile 中对 sqlite gem 的引用,自动在生产环境中切换到 PostgreSQL,而无需我在任何地方显式指定。它甚至生成了自己的 database.yml 生产设置。我想知道为什么 John 会出现上述错误呢? - Joost Schuur

0

Heroku不支持SQLite。根据Heroku文章在Heroku上使用SQLite

虽然易于使用,但SQLite并不适用于生产级数据库。相反,Heroku提供了生产级PostgreSQL数据库服务。
为什么SQLite不适合在Heroku上运行?

磁盘支持存储

SQLite在内存中运行,并将其数据存储备份到磁盘文件中。虽然这种策略对于开发工作很有效,但Heroku的Cedar堆栈具有临时文件系统。您可以向其写入数据,也可以从中读取数据,但内容会定期清除。如果您在Heroku上使用SQLite,则每24小时至少会丢失整个数据库一次。
即使Heroku的磁盘是持久性的,运行SQLite仍然不是一个好选择。由于SQLite不作为服务运行,因此每个dyno都需要运行单独的副本。每个副本都需要自己的磁盘支持存储。这意味着,由dyno驱动您的应用程序的每个dyno都会有不同的数据集,因为磁盘未同步。
与其在Heroku上使用SQLite,不如将您的应用程序配置为运行在Postgres上。

0

不要忘记删除以下部分

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

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


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