我有一个rails应用程序,我正在尝试运行测试。前一天我能够成功运行rake test:all
并且一切都处于完美状态。今天,当我运行rake test:all
时,我收到此错误:
我知道这个错误意味着什么,并知道如何根据pg_hba.conf连接等解决这个错误。我已经一次又一次地完成它并且没有任何问题。
但是,我发现真正的潜在问题是我的Postgresql已升级到9.4但我的应用程序需要9.3。正在运行brew info postgresql
会给出如下所示的输出:
基本上,输出表示我需要升级到9.4并且不再更新9.3特定配置(也如下所示)
所以现在有了背景信息,这就引出了我真正的问题。解决这个问题的“正确”方法是什么?
作为一个相对较新的ruby / rails开发人员和程序员,我总是有人协助安装我的环境,从来没有真正深入到系统安装层以及幕后发生的事情。我知道我不能也不应该再这样做了,所以在阅读了几篇关于这个主题的文章之后,这就是我所遇到的。
还有一些与主题相关的堆栈溢出问题。
与Postgresql问题相关的所有这些有什么区别?
例如,根据Homebrew上的文章,通过运行brew info postgresql, I can deduce that someone installed postgresql onto my Mac and somehow now I have 9.4 instead of 9.3 (despite to my knowledge never typing
brew更新或升级')
这是否意味着我的MAC系统上安装了PGSQL? Gemfile和Gemfile.lock怎么样?
根据捆绑文件......
Bundler通过跟踪和安装所需的确切gem和版本,为Ruby项目提供了一致的环境。
Bundler是依赖地狱的退出,并确保你的宝石 需要存在于开发,分期和生产中。开始 在项目上工作就像捆绑安装一样简单。
如果是这种情况,为什么我的捆绑安装不能解决这个差异?是不是pg 0.18.1
应该为我安装PGSQL?为什么我必须brew install postgresql和bundle install postgresql?
为了让事情变得更加混乱,Bundler文档声明为了使用bundler,你必须执行gem install bundler
。这个gem install
命令是什么,它与其他命令有什么不同?为什么我不能brew install bundler
?
(我知道brew没有安装Bundler公式,但理论上为什么不能这样做?)
再一次,在“为什么你应该使用RVM以及如何在MAC上安装Ruby”中,指南指出RVM用于安装多个版本的Ruby,可以在版本之间轻松切换,并安装宝石我需要运行gem install
。但是,如果bundle install为我做这个,为什么我需要这样做呢?如果我可以使用gem install,为什么我会使用bundle install?
我知道这篇文章中有很多问题,但解释会很好,所以我可以理解如何处理我遇到的Postgresql问题。在我看来,我要么必须将我的所有9.3数据转储到9.4中,要么以某种方式弄清楚如何降级到9.3。如果我知道这些活动部件正在做什么来确定如何处理这个问题,这将更容易。
对于愿意回答这个问题的人来说,万分感谢。我知道我应该在不久前学到这一点,但后来总比没有好。非常感谢!
答案 0 :(得分:2)
这里有很多问题,我会尽力概述这里所有移动的部分,以及解决psql问题的一些解决方案。
首先,一些背景知识:
Ruby gems
这些包含您希望应用程序使用的ruby代码。 rails,psql,bundler。对于postgres gem,您正在安装一个连接到postgres的库。这个宝石不会为你安装postgres。要安装gem,您可以运行gem install gem_name
。
<强>捆扎机强>
基本上为您的Gemfile中列出的每个gem调用gem install gem_name
的库。它会检查您的每个宝石依赖项,并尝试智能地使用您指定的版本或其他宝石所需的版本。
<强> RVM 强>
想象一下你在做两个项目。第一个是使用ruby 1.8.7的遗留应用程序,另一个是使用ruby 2.2的新宠物项目。遗留应用程序有许多gem依赖项,可能会或可能不适用于较新的ruby版本,因此您希望为每个ruby版本隔离您的环境。 RVM允许您根据需要安装尽可能多的ruby版本,每个版本都有一个单独的环境。想象一下RVM类似于虚拟机。您希望在计算机上安装Mac OSX和Linux,但是您希望它们是“独立的”,这样它们就不会对齐。
<强>自制强>
一种应用程序,允许在Mac上安装软件包。一般来说,ruby gems只能包含ruby代码,所以当你想安装postgres时会发生什么,我假设它是用C语言编写的?您可以使用brew install psql
为自制程序安装它。
回到你手头的问题:
您通过自制软件正确安装了postgres并运行了bundler来安装运行项目所需的所有gem(包括psql gem)。您的问题是您有一个使用postgres 9.3存储数据的项目,但在某些时候您将postgres版本升级到9.4。您有两个选择:
如果您拥有的数据对您很重要,您可以使用pg_upgrade实用程序将9.3数据传输到9.4安装。
如果您的数据无关紧要,您可以使用自制软件删除postgres安装并安装一个应该开箱即用的新副本。