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