在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 |
但是,當我試圖讓與SQL查詢其Rails使用序列,則返回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 integer',而不是'id sequence'(長篇故事)。在Rails 3.1中出現的原因是舊版本的ActiveRecord會試圖查詢數據庫,如果失敗了,會假定默認的'tablename_columname_seq'會起作用。現在ActiveRecord不再落後於任何東西,所以映射必須在那裏。感謝您的詳細解決方案!我們正在使用你的'alter sequence'來修復我們的數據庫。 –