PostgreSQLでは、新しいテーブルを作成し、id
カラムに新しいシーケンスを割り当てました。 PostgreSQLコンソールからレコードを挿入すると動作しますが、Railsからレコードをインポートしようとすると、関連するシーケンスを見つけることができないという例外が発生します。ここで新しく割り当てられたシーケンスが機能しない
はテーブルです:
\d+ user_messages;
Table "public.user_messages"
Column | Type | Modifiers | Storage | Description
-------------+-----------------------------+------------------------------------------------------------+----------+-------------
id | integer | not null default nextval('new_user_messages_id'::regclass) | plain |
しかし、私は使い方をRailsのSQLクエリに列を取得しようとすると、それはNULLを返します。
select pg_catalog.pg_get_serial_sequence('user_messages', 'id');
pg_get_serial_sequence
------------------------
(1 row)
レールによって提起されたエラーがあります:
UserMessage.import [UserMessage.new]
NoMethodError: undefined method `split' for nil:NilClass
from /app/vendor/bundle/ruby/1.9.1/gems/activerecord-3.2.3/lib/active_record/connection_adapters/postgresql_adapter.rb:910:in `default_sequence_name'
この問題は、バルクレコードのインポートにActiveRecord拡張機能を使用している場合にのみ発生し、単一のレコードはActiveRecordによって保存されます。
どうすれば修正できますか?
感謝。私はこの正確な問題を見ており、 'pg_get_serial_sequence'は' NULL'を返しています。奇妙なことは、私の開発マシンでは、このようにうまく動作しますが、ビルドサーバーでは例外が発生します。何か案は? –
@JimStewart: 'serial'カラムを使用しているのですか、手でシーケンスを接続しようとしていますか? –
問題の根本は、シーケンスが孤立して作成されていて、テーブルが 'id sequence'(long story)ではなく' id integer'として作成されていることです。これがRails 3.1で切り詰めたのは、古いバージョンのActiveRecordがDBにクエリを実行しようとするため、失敗した場合、デフォルトの 'tablename_columname_seq'が動作するという仮定に戻ります。これで、ActiveRecordは何にも転用されなくなり、マッピングがそこになければなりません。詳細なソリューションをありがとう!私たちはあなたの 'alter sequence'を使ってDBを修正しています。 –