0

我有一个带有这样一列的 SQLALchemy 模型:

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}

当它没有在 SOAP 请求中传递时,我如何设置 spyne 以完全跳过该字段?

4

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将在插入查询中被忽略,它将根据您的说明将其留给数据库填充该字段。

于 2013-07-18T18:36:35.140 回答