推送到Heroku-ActiveRecord :: StatementInvalid:PG :: UndefinedTable:错误:关系“用户”不存在

时间:2018-07-12 08:08:34

标签: ruby-on-rails heroku

我现在真的很沮丧。

我在本地有工作的Rails应用程序,并希望将其部署到Heroku。到目前为止,一切都很好。

每当我尝试将我的代码推送到Heroku时,它都会吐出没有找到表的错误。我确实尝试过运行heroku run rails db:migrate db:drop db:reset或其他几次都没有成功。

development:
  <<: *default
  database: postgres
  encoding: utf8


# 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:
  <<: *default
  adapter: postgresql
  database: fortest

production:
  <<: *default
  adapter: postgresql
  url: <%= ENV['DATABASE_URL'] %>

我所有的表和迁移都可以在本地计算机上正常工作,问题是我需要在Heroku上运行这些迁移来创建数据库表,但是由于预编译资产启动时失败,所以某种程度上不能这样做。

    Preparing app for Rails asset pipeline
remote:        Running: rake assets:precompile
remote:        rake aborted!
remote:        ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "users" does not exist
remote:        LINE 8:                WHERE a.attrelid = '"users"'::regclass
remote:                                                  ^
remote:        :               SELECT a.attname, format_type(a.atttypid, a.atttypmod),
remote:                             pg_get_expr(d.adbin, d.adrelid), a.attnotnull, a.atttypid, a.atttypmod,
remote:                             c.collname, col_description(a.attrelid, a.attnum) AS comment
remote:                        FROM pg_attribute a
remote:                        LEFT JOIN pg_attrdef d ON a.attrelid = d.adrelid AND a.attnum = d.adnum
remote:                        LEFT JOIN pg_type t ON a.atttypid = t.oid
remote:                        LEFT JOIN pg_collation c ON a.attcollation = c.oid AND a.attcollation <> t.typcollation
remote:                       WHERE a.attrelid = '"users"'::regclass
remote:                         AND a.attnum > 0 AND NOT a.attisdropped
remote:                       ORDER BY a.attnum

编辑:

在我的heroku日志中说构建失败-检查构建日志,在我的buid日志中一切正常,直到到达此路径:

 Bundle completed (32.92s)
       Cleaning up the bundler cache.
-----> Installing node-v8.10.0-linux-x64
-----> Detecting rake tasks
-----> Preparing app for Rails asset pipeline
       Running: rake assets:precompile
       rake aborted!
       ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "users" does not exist
       LINE 8:                WHERE a.attrelid = '"users"'::regclass

更新:

Rake::Task["assets:precompile"].clear
namespace :assets do
  task 'precompile' do
    puts "Not pre-compiling assets..."
  end
end

使用此代码片段,我可以将文件至少推送到heroku。但是,所有db:migrate db:reset函数仍然存在问题。 db:migrate似乎有相同的错误。

rake aborted!
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "users" does not exist
LINE 8:                WHERE a.attrelid = '"users"'::regclass (...)

db:create莫名其妙地引发了这个错误

FATAL:  permission denied for database "postgres"
DETAIL:  User does not have CONNECT privilege.

我看到了所有数据(用户名,密码,适配器,数据库,端口,主机),而且一切正常。

2 个答案:

答案 0 :(得分:1)

这里发生的是,您的devise_for :users文件中很可能有一个routes.rb,这导致Rails在启动时寻找Users表,但是您已经没有了。无法运行迁移,但找不到该表。

devise_for中注释routes.rb并推送到Heroku-迁移将运行,然后取消注释devise_for并再次推送。

通常最好先创建Users表,然后再在另一步中将devise添加到模型中。

答案 1 :(得分:0)

怎么样

$ git push heroku $ heroku run rake db:migrate

,然后再用另一个push再次踢出资产。