2011-03-14 3 views
0

Ruby DataMapper를 사용하여 액세스하려는 기존 PostgreSQL 데이터베이스가 있습니다. 기존 데이터베이스 스키마에 따라 모델을 만들었지 만 기본 키는 자동으로 증가하지 않습니다.레거시 PostgreSQL 데이터베이스와 함께 DataMapper를 사용하는 자동 증가 키

내 모델은 다음과 같이 다음 idSerial로 정의

class Company 
    include DataMapper::Resource 

    property :id, Serial 
    property :name, String 
end 

효과가 없습니다 : 나는 인스턴스를 만들 때 나는 때문에 위반-NOT NULL 제약의 DataObjects::IntegrityError를 얻을.

데이터베이스가 PHP/Doctrine 응용 프로그램과 공유되므로 스키마를 변경할 수 없습니다. PHP 애플리케이션은 다음과 같이 기본 키를 만들 시퀀스를 사용

SELECT NEXTVAL('"production"."sequence_id_seq"') 
INSERT INTO "production"."companies" ("name", "id") VALUES ('Acme Inc.', 40711) 

표는 다음과 같습니다

CREATE TABLE production.companies 
(
    id bigint NOT NULL, 
    "name" character varying(255) NOT NULL, 
    CONSTRAINT companies_pkey PRIMARY KEY (id), 
) 
WITH (
    OIDS=FALSE 
); 

이 동등한 교리 스키마 정의입니다 :

CompanyOrm: 
    tableName: companies 
    columns: 
    id: 
     type: integer(8) 
     unsigned: 1 
     primary: true 
     sequence: sequence_id 
    name: 
     type: string(255) 
     notnull: true 

방법 DataMapper를 사용하여 해당 동작을 다시 만들 수 있습니까? 또는이 상황에서 자동 증가 키를 만드는 다른 (더 나은) 솔루션이 있습니까? 그것은을 일으킬 가능성이 있는지 여부를 말할

INSERT INTO "production"."companies" ("name", "id") 
VALUES ('Acme Inc.', nextval('production.sequence_id_seq')) 

내가 DataMapper에 대해 충분히 알고하지 않습니다

답변

0

당신은 가져 오기와 id로 다음 시퀀스 값을 사용하는 식으로 nextval() 기능을 사용할 수 있습니다 함수는 INSERT에서 사용되지만 어쩌면 Serial 대신 자신의 Datamapper::Property을 정의하여이를 수행 할 수있는 방법이 있을까요?

ALTER TABLE production.companies 
    ALTER COLUMN id SET DEFAULT nextval('production.sequence_id_seq'); 
:

또는 수동으로 같은 시퀀스를 사용 아무것도과의 호환성을 중단해서는 안 시퀀스를 사용하여 행의 기본을 만들기 위해 테이블을 변경할 수

관련 문제