1

PostgreSQL에서 새 테이블을 만들고 id 열에 새 시퀀스를 할당했습니다. PostgreSQL 콘솔에서 레코드를 삽입하면 작동하지만 레일스에서 ​​레코드를 가져 오려고하면 관련된 시퀀스를 찾을 수 없다는 예외가 발생합니다. 여기 새로 할당 된 시퀀스가 ​​작동하지 않습니다.

는 테이블 :

\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 쿼리와 순서를 얻을 때 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를 통해 저장됩니다.

어떻게 수정합니까?

답변

4

나는이 문제를 모두 serial 열을 사용하는 것이 아니라 직접 설정한다고 생각합니다. serial 열을 사용하면 PostgreSQL은 시퀀스를 생성하고 적절한 기본값을 설정하며 시퀀스가 ​​문제의 테이블과 열에 의해 소유되고 있는지 확인합니다.

pg_get_serial_sequence(table_name, column_name)
는 직렬 또는 BIGSERIAL 열이

을 사용하는 시퀀스의 이름을 얻을하지만 당신은 너무 pg_get_serial_sequence이 도움이되지 않습니다 serial 또는 bigserial를 사용하지 않는 다음 fine manual에서.

당신은 수행하여이 문제를 해결할 수 있습니다

alter sequence new_user_messages_id owned by user_messages.id 

잘 모르겠어요이 완벽한 솔루션과 사람 (하이 어윈) 인 경우 아마 누락 된 비트를 입력합니다.

id 열의 데이터 형식으로 serial을 사용하면 문제를 해결할 수 있습니다. 그러면 시퀀스가 ​​만들어지고 연결됩니다. 예를 들어

:이 설명은

=> create sequence seq_test_id; 
=> create table seq_test (id integer not null default nextval('seq_test_id'::regclass)); 
=> select pg_catalog.pg_get_serial_sequence('seq_test','id'); 
pg_get_serial_sequence 
------------------------ 

(1 row) 
=> alter sequence seq_test_id owned by seq_test.id; 
=> select pg_catalog.pg_get_serial_sequence('seq_test','id'); 
pg_get_serial_sequence 
------------------------ 
public.seq_test_id 
(1 row) 
+0

감사합니다. 나는이 정확한 문제를보고 있고,'pg_get_serial_sequence'는'NULL'을 리턴하고 있습니다. 이상한 일은 내 dev 머신에서, 이것처럼 잘 작동하지만, 서버를 빌드 할 때 예외가 발생합니다. 어떤 아이디어? –

+0

@JimStewart :'serial' 열을 사용하고 있습니까? 아니면 시퀀스를 손으로 연결하려고합니까? –

+0

나는 문제의 근원이 시퀀스가 ​​고립되어 생성되었다는 것을 알아 냈고 우리의 테이블은'id sequence' (긴 이야기)보다는'id integer'로 만들어졌다. 이 기능이 Rails 3.1에서 잘려나 간 이유는 ActiveRecord의 이전 버전이 DB 쿼리를 시도 할 것이고, 실패 할 경우 기본'tablename_columname_seq'가 작동한다는 가정하에 다시 돌아가는 것입니다. 이제 ActiveRecord는 더 이상 아무 것도 사용하지 않으므로 매핑이 있어야합니다. 자세한 솔루션을 가져 주셔서 감사합니다! DB를 수정하기 위해'alter sequence'를 사용하고 있습니다. –

관련 문제