PGError: 错误: 关系表"table_name"不存在。

10
我正在尝试将一个简单的应用程序推送到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

在参考了 Stack Overflow 的另一个答案后,我将以下内容包含在了我的 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错误:启动Rails 3.1应用程序时缺少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

非常抱歉这里的表述可能有些生疏。提前感谢您的帮助!

我还尝试过这个链接:上传到Heroku数据库rake:migrate问题


"gem 'pg' 应该放在 :assets 块之外,它与其无关。你尝试过 heroku rake db:setup 吗?" - Robin
你不需要在Gemfile中添加pg以在Heroku上运行。 - fivetwentysix
抱歉,那是早期的实验,看看复数是否会影响它。 - Richard Burton
有相同的问题..但是rake db:setup会删除所有现有的数据吗? - kibaekr
7个回答

15
create_table :posts

您没有忘记s吗?表名应该是复数形式。


12

我刚刚执行了: bundle exec rake db:migrate,它成功了。


4

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

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

并且删除子类的acts_as_*声明就足以使db:migrate成功完成。然后我把语句添加回模型中,一切都运行得很好。我不确定为什么会这样,但如果你处于类似的情况中,这可能会在更好的解决方案出现之前暂时有所帮助。
我的情况是使用http://mediumexposure.com/multiple-table-inheritance-active-record/作为基线的多态多表继承方案,其中有一个父对象和3个对象。

我猜测与多态关联相关的某些内容正在尝试在其后面创建表之前加载模型类。问题中的SQL是AR用来确定表模式的。在这种情况下,ActiveAdmin有时会成为罪魁祸首。 - mu is too short
有趣,我正在使用 ActiveAdmin。到目前为止,我还不知道 ActiveAdmin 可以在这方面发挥作用,特别是在 db:migration 方面。 - mobilemonkey
我非常确定ActiveAdmin尝试在应用程序初始化器中预加载一些内容,并且该初始化发生在db:migrate之前。我不知道ActiveAdmin的哪些部分或模型关联会触发问题,但人们通过暂时禁用ActiveAdmin来解决类似的问题。 - mu is too short

3
如果您使用的是ActiveAdmin,无论PG报告哪个表不存在,请注释掉该ActiveAdmin rb文件的内容。
例如,对于此情况PGError: ERROR: relation "posts" does not exist,请注释掉app/admin/posts.rb的整个内容,然后在完成迁移后取消注释。

谢谢,这就是我需要的。 - Uri Klar
这对我没用。另外,您会注释掉模型文件的哪些部分? - huertanix

1

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

检查您的迁移文件名/时间戳。 这些按顺序运行。 我曾经遇到过一个问题,我的迁移生成器将外键表放在第一位...我交换了文件名,它就起作用了。

这只是一个小概率事件,但我想提出来。


0
在我的情况下,我正在迁移中执行rename_table操作,此前已经修改了模型名称以反映新表名。我将User移动到User :: User中。需要将users表重命名为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模块中,正是这个类方法在运行rake db:migrate时给了我PGError,就像OP一样。暂时移除这个类方法,让我可以顺利地运行迁移。


-1

我曾经遇到过同样的问题。我运行了heroku run rake db:migrate,问题得以解决。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接