PGError:错误:关系“table_name”不存在

时间:2011-12-05 22:38:15

标签: ruby-on-rails ruby ruby-on-rails-3 postgresql heroku

我正在尝试将一个简单的应用程序推送到heroku并运行:

heroku rake db:migrate

但是我收到以下错误:

rake aborted!
PGError: ERROR:  relation "posts" 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 = '"posts"'::regclass
               AND a.attnum > 0 AND NOT a.attisdropped
             ORDER BY a.attnum

Tasks: TOP => db:migrate => environment
(See full trace by running task with --trace)

我的迁移看起来像这样:

class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :source
      t.string :tweetid
      t.string :pure
      t.string :media
      t.string :destination
      t.datetime :time
      t.timestamps
    end
  end
end

并且,在提到另一个SO答案之后,我在我的Gemfile中包含了以下内容:

# Gems used only for assets and not required
# in production environments by default.
group :assets do
  gem 'sass-rails',   '~> 3.1.4'
  gem 'coffee-rails', '~> 3.1.1'
  gem 'uglifier', '>= 1.0.3'
  gem 'pg'
end

提前感谢您的帮助!

---更新---

我感到困惑的主要原因是这一切都在本地运行,而不是在我在heroku上运行迁移时。

以下是我现在得到的错误:

rake aborted!
Please install the postgresql adapter: `gem install activerecord-postgresql-adapter` (pg is not part of the bundle. Add it to Gemfile.)

我一直在看这个问题:

Heroku error when launch rails3.1 app missing postgres gem

我几乎可以肯定我的database.yml不应该像这样(因为我需要运行postgresql !!!):

# SQLite version 3.x
#   gem install sqlite3
#
#   Ensure the SQLite 3 gem is defined in your Gemfile
#   gem 'sqlite3'
development:
  adapter: sqlite3
  database: db/development.sqlite3
  pool: 5
  timeout: 5000

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  adapter: sqlite3
  database: db/test.sqlite3
  pool: 5
  timeout: 5000

production:
  adapter: sqlite3
  database: db/production.sqlite3
  pool: 5
  timeout: 5000

对这里的忠诚道歉。感谢您的帮助!

还尝试了此链接:Uploading to Heroku DB rake:migrate problem

7 个答案:

答案 0 :(得分:15)

create_table :posts

你没忘记s吗?表名应为复数。

答案 1 :(得分:11)

我刚跑了:bundle exec rake db:migrate并且它有效

答案 2 :(得分:4)

我有类似的问题,但它不是由迁移或Gemfile引起的。我在多态关系中设置了4个模型。删除语句

belongs_to :assetable, :polymorphic => true, :dependent => :destroy

并删除子类'acts_as_*声明就足以使db:migrate成功完成。然后我添加了模型中的语句,一切都很好。我不确定为什么会这样,但如果你处于类似的情况,这可能会暂时有所帮助,直到找到更好的解决方案。

我的情况是使用http://mediumexposure.com/multiple-table-inheritance-active-record/作为基线的一个父对象和三个对象之间的多态多表继承方案。

答案 3 :(得分:3)

如果您正在使用ActiveAdmin,那么PG所说的表格不存在,请注释掉该ActiveAdmin rb文件的内容。

例如,对于这种情况PGError: ERROR: relation "posts" does not exist,请注释掉app/admin/posts.rb的全部内容,然后在完成迁移后取消注释。

答案 4 :(得分:1)

罗宾可能是对的,但以防万一......

检查迁移的文件名/时间戳。这些按顺序运行。我有一个问题,一个使我的迁移的生成器把外表放在第一位......我切换了文件名并且它有效。

这是一个很长的镜头,但我想我会把它放在那里。

答案 5 :(得分:0)

就我而言,在我已经修改了我的模型名称以反映新的表名后,我在迁移中正在进行rename_table。我已将User移至User::Userusers表需要重命名为user_users,因此我的迁移看起来像

class RenameUsersTableWithPrefix < ActiveRecord::Migration
  def up
    rename_table :users, :user_users
  end

  def down
    rename_table :user_users, :users
  end
end

而不是

app/models/user.rb

我现在有了

app/models/user.rb
app/models/user/user.rb

后者包含User::User模型,前者包含

module User
  def self.table_name_prefix
    "user_"
  end
end

新添加的User模块中的这个类方法在运行PGError时给了我rake db:migrate,就像OP一样。在我运行迁移时暂时删除此类方法,可以使迁移顺利运行。

答案 6 :(得分:-1)

我遇到了同样的问题。我跑了heroku run rake db:migrate,解决了这个问题。