«PGError: нет подключения к серверу» при попытке создать или сохранить - PullRequest
1 голос
/ 27 июня 2011

Ruby 1.9.1 + ActiveRecord 2.3.5 + Postgres 8.3.7

Вот примерный набросок моего кода. Не обращайте внимания на любые очевидные детали синтаксиса. Приведенная ниже модель наследуется от ActiveRecord :: Base, подключенной к базе данных Postgres 8.3.7 через ActiveRecord 2.3.5.

class TableA
   has_many :tableB
end

class TableB
   belongs_to :tableA
   has_many :tableC
end

class TableC
   belongs_to :tableB
   has_many :tableD
end

class TableD
   belongs_to :tableC
   has_many :tableE
end

class TableE
   belongs_to :tableD
end

# Note that tableA has fids that are referenced in tableE but is not part of this model
#
# Later in the script, in the same global scope, I want to add entries to these tables if
# I cannot find what I need. Bear in mind that this part betrays much Ruby noobiness.

toAdd.each do |widget|
   add_tableA = TableA.find_by_sql().first # assumes I will get one back based on earlier sanity checks

   add_tableB = TableB.find_by_sql().first
   if (add_tableB == nil)
       new_tableB = TableB.new( # value assignments )
       new_tableB.save
       add_tableB = TableB.find_by_sql().first
   end

   add_tableC = TableC.find_by_sql().first
   if (add_tableC == nil)
       new_tableC = TableC.new( # value assignments )
       new_tableC.save
       add_tableC = TableC.find_by_sql().first
   end

   add_tableD = TableD.find_by_sql().first
   if (add_tableD == nil)
       new_tableD = TableD.new( # value assignments )
       new_tableD.save
       add_tableD = TableD.find_by_sql().first
   end

   # I step into TableA again because items in TableE are linked to items in TableA, but they are
   # distinct from the "high level" item I grabbed from TableA earlier.

   add_tableA = TableA.find_by_sql().first
   if (add_tableA == nil)
       new_tableA = TableA.new( # value assignments )
       new_tableA.save
       add_tableA = TableA.find_by_sql().first
   end

   # Now that I have a TableA id to put into TableE, just create TableE row because I know this
   # does not exist yet.

   new_tableE = TableE.new( # value assignments ) # again, this is assumed to be new based on earlier checks
   new_tableE.save

end

Что всегда происходит, я получаю следующую трассировку стека:

/...gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract_adapter.rb:219:in `rescue in log': PGError: no connection to the server (ActiveRecord::StatementInvalid)
: ROLLBACK
    from .../gems/1.9.1/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract_adapter.rb:202:in `log'
    from .../gems/1.9.1/gems/activerecord-2.3.5/lib/active_record/connection_adapters/postgresql_adapter.rb:550:in `execute'
    from .../gems/1.9.1/gems/activerecord-2.3.5/lib/active_record/connection_adapters/postgresql_adapter.rb:576:in `rollback_db_transaction'
    from .../gems/1.9.1/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/database_statements.rb:143:in `rescue in transaction'
    from .../gems/1.9.1/gems/activerecord-2.3.5/lib/active_record/connection_adapters/abstract/database_statements.rb:125:in `transaction'
    from .../gems/1.9.1/gems/activerecord-2.3.5/lib/active_record/transactions.rb:182:in `transaction'
    from .../gems/1.9.1/gems/activerecord-2.3.5/lib/active_record/transactions.rb:200:in `block in save_with_transactions!'
    from .../gems/1.9.1/gems/activerecord-2.3.5/lib/active_record/transactions.rb:208:in `rollback_active_record_state!'
    from .../gems/activerecord-2.3.5/lib/active_record/transactions.rb:200:in `save_with_transactions!'

.... независимо от того, звоню ли я сохранить, сохранить !, или создаю вместо нового и сохраняю.

strace показывает, что я могу заставить работать только одну транзакцию BEGIN..INSERT..COMMIT для каждого запуска этой операции. Любые последующие попытки ВСТАВИТЬ в транзакцию либо в одном и том же цикле, либо в следующем завершаются разрывом соединения перед отправкой COMMIT. Очевидно, что я делаю что-то не так с тем, как я вступаю в модель ActiveRecord.

Я вижу следующую строку только перед тем, как будет настроен первый успешный оператор INSERT. Есть ли в ActiveRecord что-то, что позволяет мне сохранять это при просмотре таблиц, или я просто делаю это неправильно?

rt_sigaction(SIGPIPE, {0x1, [], SA_RESTORER|SA_RESTART, 0x3876c0eb10}, {0x4b2ff0, [], SA_RESTORER|SA_RESTART, 0x3876c0eb10}, 8) = 0

sendto(3, "Q\0\0\2e          SELECT attr.attna"..., 614, 0, NULL, 0) = 614

rt_sigaction(SIGPIPE, {0x4b2ff0, [], SA_RESTORER|SA_RESTART, 0x3876c0eb10}, {0x1, [], SA_RESTORER|SA_RESTART, 0x3876c0eb10}, 8) = 0

poll([{fd=3, events=POLLIN|POLLERR}], 1, -1) = 1 ([{fd=3, revents=POLLIN}])

recvfrom(3, "T\0\0\0:\0\2attname\0\0\0\4\341\0\2\0\0\0\23\0@\377\377\377\377\0"..., 16384, 0, NULL, NULL) = 541

Любая помощь здесь очень ценится.

1 Ответ

1 голос
/ 28 июня 2011

Спасибо всем. Я прошу прощения за то, что нашел время, чтобы попытаться это исправить Этот экземпляр postgres зависит от запуска второго процесса для обработки передачи событий запуска в другие процессы. Этот процесс не выполнялся, поэтому сервер базы данных загрузился после первого подтвержденного INSERT. Это обычная вещь в доме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...