2013-03-19 3 views
1

저는 Ruby Sequel (ORM gem)을 사용하여 Postgres 데이터베이스에 연결하고 있습니다. 나는 어떤 모델도 사용하지 않고있다. 내 insert 문은 "null null"이 자동으로 추가 된 것처럼 보입니다 (따라서 새로 삽입 된 행 ID/pk가 반환되지 않습니다). 이것의 용도는 무엇입니까? 그리고 이것이 왜 기본입니까? 그리고 더 중요한 것은 어떻게 그것을 비활성화 할 수 있습니까 (연결 전체)?내 삽입물에 "반환 null"을 추가하는 속편. 어떻게 비활성화합니까?

또한 데이터 세트가 있음을 확인했습니다. 메소드를 리터닝했지만 작동하지 않는 것 같습니다!

require 'sequel' 

db = Sequel.connect 'postgres://user:[email protected]/foo' 
tbl = "public__bar".to_sym #dynamically generated by the app 
dat = {x: 1, y: 2} 
id = db[tbl].insert(dat) #generated sql -- INSERT INTO "public"."bar" ("x", "y") VALUES (1, 2) RETURNING NULL 
이 중요하지만 문제의 테이블 (포스트 그레스에게 테이블 상속을 사용하여) 상속하는 경우

이 몰라

루비 1.9.3p392 (2013년 2월 22일)의 i386-mingw32]

속편 (3.44.0)

--edit 1 - troubleshooting--

약간의 테이블 상속 같은데 후 여기에 문제가 될 수 있습니다. Sequel은 테이블의 pk를 결정하기 위해 쿼리를 자동으로 실행하는 것으로 보입니다 (내 경우에는 테이블의 체인에 정의 된 pk). "반환 null"이 추가되는 것을 발견하지 못했습니까? 그게 문제처럼

SELECT pg_attribute.attname AS pk FROM pg_class, pg_attribute, pg_index, pg_namespace WHERE pg_class.oid = pg_attribute.attrelid AND pg_class.relnamespace = pg_namespace.oid AND 
pg_class.oid = pg_index.indrelid AND pg_index.indkey[0] = pg_attribute.attnum AND pg_index.indisprimary = 't' AND pg_class.relname = 'bar' 
AND pg_namespace.nspname = 'public' 

--edit 2--

그래이 보인다! 당신은 PostgreSQL의 상속을 사용하는 경우

+0

나는 내 응용 프로그램이 관찰되지 않습니다. 몇 가지 코드를 보여주십시오. –

+0

다행 니가 해결 했어. 잘 했어! :) –

+0

하, 고마워. 그러나 슬프게도, 단지 확인하고 아직 해결책이 없습니다! – rebnoob

답변

-1

다음은 하지 상속 참고하시기 바랍니다 :

  • 기본 키

  • 고유 제한 조건

  • 외래 키

일반적으로 각 하위 테이블에서 을 선언해야합니다. 예를 들어 수행

CREATE TABLE my_parent (
     id bigserial primary key, 
     my_value text not null unique 
); 
CREATE TABLE my_child() INHERITS (my_parent); 
INSERT INTO my_child(id, my_value) values (1, 'test'); 
INSERT INTO my_child(id, my_value) values (1, 'test'); -- works, no error thrown 

당신이 대신 원하는 것은이 작업을 수행하는 것입니다 : 당신이 해결하기 위해 몇 가지 긴급 DDL 문제를 가지고있는 것처럼

CREATE TABLE my_parent (
     id bigserial primary key, 
     my_value text not null unique 
); 
CREATE TABLE my_child(
     primary key(id), 
     unique(my_value) 
) INHERITS (my_parent); 
INSERT INTO my_child(id, my_value) values (1, 'test'); 
INSERT INTO my_child(id, my_value) values (1, 'test'); -- unique constraint violation thrown 

이 나에게 소리.

당신이 가진 첫번째에 두 번째의 제약을 개조 수 :

ALTER TABLE my_child ADD PRIMARY KEY(id); 
ALTER TABLE my_child ADD UNIQUE (my_value);