Heroku推问题第2部分 - Postgresql - PGError关系不存在 - Ruby on Rails

时间:2010-04-23 22:31:39

标签: ruby-on-rails ruby heroku

好的,所以通过Postgresql和SQLite之间的区别来完成我的最后一个问题,看起来像Heroku告诉我我有另一个。我是ruby和rails的新手,所以很多这些东西我起初都无法解读。在这里寻找一个小方向。错误消息和PostsController索引如下。我检查了我的routes.rb文件,似乎一切都很好,但我可能会遗漏一些东西。如果你需要我会发布。

Processing PostsController#index (for 99.7.50.140 at 2010-04-23 15:19:22) [GET]

ActiveRecord::StatementInvalid (PGError: ERROR:  relation "tags" does not exist
:             SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
              FROM pg_attribute a LEFT JOIN pg_attrdef d
                ON a.attrelid = d.adrelid AND a.attnum = d.adnum
             WHERE a.attrelid = '"tags"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum
):

PostsController#索引

  def index
    @tag_counts = Tag.count(:group => :tag_name, 
       :order => 'count_all DESC', :limit => 20)
       conditions, joins = {}, :votes

    @ugtag_counts = Ugtag.count(:group => :ugctag_name, 
       :order => 'count_all DESC', :limit => 20)
       conditions, joins = {}, :votes

    @vote_counts = Vote.count(:group => :post_title, 
          :order => 'count_all DESC', :limit => 20)
          conditions, joins = {}, :votes


       unless(params[:tag_name] || "").empty?
         conditions = ["tags.tag_name = ? ", params[:tag_name]]
         joins = [:tags, :votes]
       end
       @posts=Post.paginate(
                 :select => "posts.*, count(*) as vote_total", 
                 :joins => joins, 
                 :conditions=> conditions, 
                 :group => "votes.post_id, posts.id ", 
                 :order => "created_at DESC",
                 :page => params[:page], :per_page => 5)
        @popular_posts=Post.paginate(
                 :select => "posts.*, count(*) as vote_total", 
                 :joins => joins, 
                 :conditions=> conditions, 
                 :group => "votes.post_id, posts.id", 
                 :order => "vote_total DESC",
                 :page => params[:page], :per_page => 3)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
      format.json { render :json => @posts }
      format.atom
    end
  end

10 个答案:

答案 0 :(得分:2)

当从rails 3.0.3升级到rails 3.0.5时,我遇到了类似的“PGError:错误:关系”...“不存在”问题 - 看起来好像数据库名称复数算法已更改。以前我必须复数:“project_metadatas”现在称为“project_metadata”。

对我来说,修复是添加一个简单的迁移,重命名为违规表:

class MetadataName < ActiveRecord::Migration
  def self.up
    rename_table :project_metadatas, :project_metadata
  end

  def self.down
    rename_table :project_metadata, :project_metadatas
  end
end

答案 1 :(得分:1)

这看起来很奇怪:

WHERE a.attrelid = '"tags"'::regclass

单引号分隔字符串文字,因此内部双引号被视为字符串的一部分。所以它正在寻找一个实际上有"个字符作为名称一部分的表名。

我不确定Rails管道是如何生成该查询的,所以我没有任何建议来修复它。遗憾...

但这肯定是一个Leaky Abstraction问题。 : - )

答案 2 :(得分:1)

喜 我发现了一些东西 所以我的问题是:

 `enter code here`WHERE a.attrelid = '"posts"'::regclass

你们有些人使用带有初始化文件的gem_admin之类的gem吗? 因为当我在与此模型相关的初始化文件中评论我的操作时,我的migartion可以工作:)

 #config.model Post do
 #  field :body, :text do
 #    ckeditor true
 #  end
 #end

所以也许(我不是sur)初始化器在rake任务之前。它要求一个模型,但在那里 不是sql表,所以bug。 无论如何,这个动作适用于我的测试和生产环境:)

答案 3 :(得分:1)

我有同样的问题,问题是我忘记了使用rake迁移数据库。以下内容使一切正常:

bundle exec rake db:migrate

答案 4 :(得分:0)

这个Rails应用程序使用了什么宝石?您是否在应用程序的根目录中有.gems清单文件,以便heroku自动检测并安装?我看到你正在使用will paginate gem。如果你还没有将gems添加到.gems文件中,那我觉得麻烦。如果您还没有这样做,那么这将是寻求帮助的最佳地点:Heroku | Managing Gems

答案 5 :(得分:0)

我刚刚在我的rails app中发现了这个问题的根源,感谢Bill Karwin的上述提示:

当我通过在我的开发框中运行rake db:schema:dump来更新我的数据库模式时,它会用引用的字符串替换一些(但不是全部)符号......

例如,

add_index :taggings, ["vectors"] 

变为

add_index "taggings", ["vectors"] 

这不会在我的开发箱上造成任何问题,但是当从头开始创建数据库时,heroku似乎不能很好地处理差异,而不是在db:push上创建。

当我手动切换表名符号时,我的应用程序又开始播放了。

如果有人知道这个副手的原因,我会感兴趣...

答案 6 :(得分:0)

我有同样的问题。我打赌你的表名必须是'tag',而不是'tags'。

如果在Postgresql中将表名更改为“tags”,它将起作用。但为什么?我给出了单数的模型名称,GHOST取复数。

答案 7 :(得分:0)

将以下行添加到/config/environment.rb

ActiveRecord::Base.pluralize_table_names = false

答案 8 :(得分:0)

对我来说同样的问题,但只有en test和prod env。

rake db:migrate 

确定

rake db:migrate RAILS_ENV=test
rake aborted!
PGError: ERREUR:  la relation « posts » n'existe pas
LINE 4:              WHERE a.attrelid = '"posts"'::regclass
                                        ^
:             SELECT a.attname, format_type(a.atttypid, a.atttypmod), d.adsrc, a.attnotnull
              FROM pg_attribute a LEFT JOIN pg_attrdef d
                ON a.attrelid = d.adrelid AND a.attnum = d.adnum
             WHERE a.attrelid = '"posts"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum

答案 9 :(得分:0)

即使我记得要进行迁移,我也会遇到同样的问题。对我来说,解决方案是重启:

heroku restart