我正在尝试将一个简单的应用程序推送到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
对这里的忠诚道歉。感谢您的帮助!
答案 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::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
模块中的这个类方法在运行PGError
时给了我rake db:migrate
,就像OP一样。在我运行迁移时暂时删除此类方法,可以使迁移顺利运行。
答案 6 :(得分:-1)
我遇到了同样的问题。我跑了heroku run rake db:migrate
,解决了这个问题。