2013-07-16 3 views
0

나는 그런 열이있는 SQLAlchemy의 모델을 가지고 생성SOAP 요청에 존재하지 않는 필드를 건너 뛰도록 설정 하시겠습니까?

updated_at = Column(DateTime, nullable=False, server_default=func.now(), 
         onupdate=func.now()) 

는 WSDL : updated_at 필드가 누락 된 업데이트 요청에

<xs:element name="updated_at" type="xs:dateTime" minOccurs="0"/> 

및 spyne이 원인이 None 그 값을 매핑합니다

IntegrityError: (IntegrityError) null value in column "updated_at" violates not-null constraint 
'UPDATE subcsription SET updated_at=%(updated_at)s WHERE subcsription.id = %(subcsription_id)s' {'subcsription_id': 27, 'updated_at': None} 

SOAP 요청에서 전달되지 않을 때 spyne가 필드를 건너 뛰도록 설정하려면 어떻게해야합니까?

답변

1

인터페이스와 데이터베이스 스키마가 일대일로 일치하지 않아도됩니다. updated_at 구성원이없는 별도의 오브젝트를 정의하여 서비스 정의의 입력 유형으로 사용할 수 있습니다. 예 :

class SomeObject(TableModel): 
    __tablename__ = 'some_table' 

    id = UnsignedInteger64(pk=True) 
    updated_at = DateTime(server_default=func.now(), onupdate=func.now()) 
    some_data = Unicode 

class SomeWriteObject(TableModel): 
    __tablename__ = 'some_table' 

    id = UnsignedInteger64(pk=True) 
    some_data = Unicode 

# or, you could do this: 
class SomeWriteObject(TableModel): 
    __tablename__ = 'some_table' 
    _type_info = [ (k,v) for k,v in SomeObject._type_info.items() 
                if not k in ('updated_at',) ] 
class SomeService(ServiceBase): 
    @rpc(SomeWriteObject, _returns=UnsignedInteger64) 
    def add_some_object(ctx, obj): 
     ctx.udc.session.add(obj) 
     ctx.udc.session.commit() 
     return obj.id 

이 방법 updated_at는 당신의 지시에 따라 해당 필드를 채우기 위해 데이터베이스에 떠나 삽입 쿼리에서 남아있을 것입니다.

+0

필드를 수동으로 지정하고 일부 필드를 제외시키는 것을 의미합니까? 왜냐하면 지금은 SQLALchemy 모델에서 필드가 자동으로 추출되기 때문입니다. SOAP 요청에서 전달되지 않은 경우 들어오는 객체의 필드 값을 설정하지 않기 위해 원숭이 패치 문자열을 종료했습니다. 이것은 또한 spyne 필드가 선택적이지만 SOAP 요청에서 전달되지 않아서 'None'으로 덮어 쓰게되는 문제를 해결합니다. – warvariuc

+0

이 작업은 수동으로 수행 할 필요가 없습니다. 편집을 참조하십시오. 또한 일부 원숭이 패치 코드를 공유 할 수 있습니까? 그것은 다른 사람들을 도울 수 있습니다. –