ActiveRecord::NoDatabaseError: 本地用户ID不存在

22

开发一个API-only的Rails应用程序,以消耗API数据,过滤掉一些字段,然后广播我们想要公开的字段。

我的应用程序正常返回数据,但我意识到在源API级别上,我们更改了正在公开的数据字段之一的数据类型。为了适应这种情况,我提交了我的工作,检查了一个新分支,运行了迁移来更改数据字段的数据类型,然后我对它的工作方式不满意,回滚了迁移,提交了,并检出了主分支。应用程序正常返回数据。然而,现在当我使用类似.first.last等查找器方法在Rails Console中测试我的模型记录时,我会得到下面的错误。在此之前,它们都很好用。

我查看了周围,没有看到任何关于这个特定错误的线程(它们似乎都涉及查找展示页面的单个记录) - 虽然这个,和这个线程(通过扩展)最接近。检查我使用的数据库的用户时,显示错误中的用户ID(“501”)不存在。

我做了什么,我需要做什么才能再次调用查找器方法?我需要在我的数据库中创建引用错误中的用户吗?(为什么不是我总是用来连接到我的数据库的默认用户?错误中的用户ID从哪里来?它真的重要吗?)

附:如果相关,我使用rake db:rollback回滚我的迁移,如此线程所述。

提前感谢。

Rails Console

.2.1 :001 > KoboApi.first
ActiveRecord::NoDatabaseError: local user with ID 501 does not exist

    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql_adapter.rb:661:in `rescue in connect'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `connect'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql_adapter.rb:242:in `initialize'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-postgis-adapter-3.1.4/lib/active_record/connection_adapters/postgis_adapter.rb:51:in `initialize'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-postgis-adapter-3.1.4/lib/active_record/connection_adapters/postgis/create_connection.rb:37:in `new'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-postgis-adapter-3.1.4/lib/active_record/connection_adapters/postgis/create_connection.rb:37:in `postgis_connection'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:438:in `new_connection'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:448:in `checkout_new_connection'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:422:in `acquire_connection'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:349:in `block in checkout'
    from /Users/toby/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:348:in `checkout'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:263:in `block in connection'
    from /Users/toby/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/monitor.rb:211:in `mon_synchronize'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:262:in `connection'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract/connection_pool.rb:571:in `retrieve_connection'
... 13 levels...
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/railties-4.2.5.1/lib/rails/commands/console.rb:9:in `start'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/railties-4.2.5.1/lib/rails/commands/commands_tasks.rb:68:in `console'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/railties-4.2.5.1/lib/rails/commands/commands_tasks.rb:39:in `run_command!'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/railties-4.2.5.1/lib/rails/commands.rb:17:in `<top (required)>'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:274:in `require'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:274:in `block in require'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:274:in `require'
    from /Users/toby/code/projects/koboApi-broker/bin/rails:9:in `<top (required)>'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:268:in `load'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:268:in `block in load'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:240:in `load_dependency'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activesupport-4.2.5.1/lib/active_support/dependencies.rb:268:in `load'
    from /Users/toby/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'
    from /Users/toby/.rvm/rubies/ruby-2.2.1/lib/ruby/site_ruby/2.2.0/rubygems/core_ext/kernel_require.rb:54:in `require'

我肯定会拿到我的记录 - 它们正在被导入数据库: Rails dbconsole
koboApi_development=# select * from kobo_apis limit 1;
  id  | lemurs_quantity | month_and_year | _geolocation | lemur_category | location_admin1 | location_admin2 | record_id | sighting_month | sighting_year
------+-----------------+----------------+--------------+----------------+-----------------+-----------------+-----------+----------------+---------------
 1365 |               1 |                |              | I_dont_remembe | antsiranana     | diana           |   1234567 | no_response    | 2013
(1 row)

koboApi_development=# \du
                             List of roles
 Role name |                   Attributes                   | Member of
-----------+------------------------------------------------+-----------
 [user]    | Superuser, Create role, Create DB, Replication | {}

来自我的模式

ActiveRecord::Schema.define(version: 20160705203507) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"
  enable_extension "postgis"

  create_table "kobo_apis", force: :cascade do |t|
    t.integer "lemurs_quantity"
    t.date    "month_and_year"
    t.text    "_geolocation"
    t.text    "lemur_category"
    t.string  "location_admin1"
    t.string  "location_admin2"
    t.integer "record_id"
    t.string  "sighting_month"
    t.string  "sighting_year"
  end

  create_table "my_spatial_table", force: :cascade do |t|
    t.geography "polygon_data", limit: {:srid=>4326, :type=>"polygon", :geographic=>true}
  end

end

我的database.yml文件

development:
  adapter: postgis
  encoding: unicode
  postgis_extension: postgis      # default is postgis
  postgis_schema: public          # default is public
  schema_search_path: public,postgis
  database: koboApi_development
  pool: 5

test:
  adapter: postgresql
  encoding: unicode
  database: koboApi_test
  pool: 5

production:
  adapter: postgresql
  encoding: unicode
  database: koboApi_production
  pool: 5
3个回答

80

如果你遇到这个错误,那么看起来是Spring的问题,而不是数据库的问题:

/Users/yad/.rvm/gems/ruby-2.3.0/gems/activerecord-4.2.6/lib/active_record/connection_adapters/postgresql_adapter.rb:661:in `rescue in connect': local user with ID 501 does not exist
 (ActiveRecord::NoDatabaseError)

在 Rails 根目录中输入:

spring stop

命令行应该会显示:

Spring stopped.

这样之后迁移就可以正常工作了!


类似的问题一段时间前在rails/spring上已经关闭了 https://github.com/rails/spring/issues/125 - Dorian
这个对我起作用了。我是Rails的新手,不知道为什么这能够奏效,或者我怎么想到这个……但还是谢谢!是Google把我带到了这里。 - anonymous coward
那么是什么告诉你这是春季问题的呢? - Jared Menard

7
我要分享一下我成功的经验,听起来像个笑话,但并不是。
我的意思是,我关闭了需要与我的设置并行运行的Redis实例,将分支上的本地更改存储起来,然后再次尝试。它奏效了!
之后我只关闭了独角兽服务器,弹出存储区以恢复我的本地更改并重新启动。是的,它仍然有效。
我知道这毫无意义,对于没有更好的解释我深感抱歉。
我唯一的猜测是,我可能让独角兽和Redis服务器运行时间过长(我记不得上次关闭我的Mac),可能出了点问题。如果是这样,那么重启整个堆栈可能是解决方案。
希望这给你,亲爱的读者,提供了关于这个神秘错误的思路。

3
成功了!在我的电脑坏掉后,我开始在本地收到这个错误。我刚刚重启了它,并让它优雅地终止进程,当它重新启动时一切都正常运行了。 - JLF
对我来说,只需要退出并重新启动iterm2即可 - 之前遇到过同样的问题,也是因为Mac运行时间太长了。 - ruby24

4

这个错误与您的业务数据无关。查看日志的前几行...

ActiveRecord::NoDatabaseError: local user with ID 501 does not exist

    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql_adapter.rb:661:in `rescue in connect'
    from /Users/toby/.rvm/gems/ruby-2.2.1/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `connect'

很明显Rails不能连接到数据库。

提到的本地用户可能是配置为访问postgres数据库的操作系统用户,其记录已被删除或损坏。

尝试使用控制台中的psql连接到您的数据库并查看是否有任何问题。命令应该类似于这样。

psql --host=localhost --port=5432 --username=<your postgres user> --password --dbname=koboApi_development

由于您的数据库配置中未设置username,因此它可能来自环境变量。请检查其是否包含正确的值。


1
非常有帮助。我可以轻松访问数据库和表,数据也在其中。Rails服务器运行良好,但我无法通过Rails控制台访问数据库。从这篇文章中获得启示,我添加了我的默认postgres用户名的“用户名”和“密码”,然后它就可以工作了。所以似乎一切都解决了。我应该就此放手,还是应该深入挖掘?pgAdmin3将我的默认用户列为我拥有的每个数据库的所有者,而我没有其他用户... - Mugshep
根据您的配置要求,您可以将其保持不变,这是一种有效的方法。如果您必须使用系统用户访问postgres并需要rails自动选择它,则可能需要深入挖掘操作系统用户记录以找出解决方案。 - Nic Nilov

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