使用SQLite3将Rails推送到Heroku失败

时间:2010-09-19 18:49:45

标签: ruby-on-rails heroku deployment sqlite

当我尝试将我的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中定义的解决方案可行,我只是想知道为什么。

7 个答案:

答案 0 :(得分: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'

答案 1 :(得分:11)

SQLite需要永久可写文件系统。 (即您的程序最终需要访问POSIX fopen()和fwrite()API调用特定文件)。 Heroku does not provide a permanent writable file system。因此,SQLite 3将无法正常工作。

答案 2 :(得分:5)

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:4)

对于更新版本的Sqlite,您可以改用:

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

这为我解决了。

答案 5 :(得分:0)

不要忘记删除以下部分

  

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

来自.gitignore文件的

。如果您使用“rails new your-application-name”命令

,则使用此声明创建它

答案 6 :(得分:0)

Heroku不支持SQLite。来自Heroku文章SQLite on Heroku

  

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

     

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

     

磁盘备份存储

     

SQLite在内存中运行,并将其数据存储备份在磁盘上的文件中。虽然这种策略适用于开发,但Heroku的Cedar堆栈有ephemeral filesystem。您可以写入它,并且可以从中读取,但内容将定期清除。如果您在Heroku上使用SQLite,则至少每24小时丢失一次整个数据库。

     

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

     

您可以将应用配置为在Postgres上运行,而不是在Heroku上使用SQLite。