2013-07-16 22 views
0

我有一個SQLAlchemy的模型具有這樣的柱:設置spyne跳過SOAP請求中不存在的字段?

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

產生WSDL:

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

在更新請求updated_at字段缺失,和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} 

我怎麼可以設置spyne跳過場時,它不是在SOAP請求傳遞呢?

回答

1

您的界面和數據庫架構不需要匹配1對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設置爲不設置傳入對象的字段值。這也解決了一個問題,當一個spyne字段是可選的,但它沒有被傳入SOAP請求中,導致它被'None'覆蓋。 – warvariuc

+0

這不需要手動完成,請參閱我的編輯。另外,你可以分享你的猴子修補代碼在一些github的要點?它可以幫助其他人。 –