1

在声明性方法中,我想排除一个属性,当我的列名和属性名相同时,它可以正常工作。但是,如果我给出不同的名称,那么它就不起作用了。这是我的示例代码。

Base = declarative_base() 
class tblUser(Base):
    __tablename__ = 'tblUser'
    User_Id = Column('User_Id', String(100), primary_key=True)
    SequenceNo = Column('Sequence_No', Integer)
    FullName = Column('FullName', String(50))
    __mapper_args__ = {'exclude_properties' :['Sequence_No']}

user = tblUser()
user.User_Id = '1000001'
user.SequenceNo = 101
session.add(user)
session.commit()

在上面的示例中,即使我为其分配了一些值,我也不希望在数据库中更新 SequenceNo 属性。所以我使用了 exclude_properties 但仍然更新了 db 中的值。但是,如果我将属性名称从 SequenceNo 更改为 Sequence_No (与列名相同),那么它会按照行为工作。谁能帮我?

谢谢阿迪

4

1 回答 1

0

不幸的是,__mapper_args__很可能是错误的做法。它旨在控制现有数据库表在映射器中的反映,而不是使列“只读”。

我认为更好的方法是使用混合属性

from sqlalchemy.ext.hybrid import hybrid_property

Base = declarative_base() 
class tblUser(Base):
    __tablename__ = 'tblUser'
    User_Id = Column('User_Id', String(100), primary_key=True)
    FullName = Column('FullName', String(50))

    _Sequence_No = Column('Sequence_No', Integer)
    _local_Sequence_No = None

    @hybrid_property
    @property
    def SequenceNo(self):
        if self._local_Sequence_No is not None:
            return self._local_Sequence_No
        return self._SequenceNo

    @SequenceNo.setter
    def SequenceNo(self, value):
        self._local_Sequence_No = value

原始Sequence_No列可通过私有属性获得,该SequenceNo属性拦截写入并将它们存储在实例上以供以后重用,但不会写入数据库。

于 2012-09-05T10:30:00.363 回答