SQLAlchemy exclude_properties在Declarative中不起作用

时间:2012-09-05 10:14:27

标签: python sqlalchemy

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

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(与列名称相同),那么它将根据行为进行操作。谁能帮我?

由于 ADHI

1 个答案:

答案 0 :(得分:0)

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

我认为更好的方法是使用hybrid property

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属性拦截写入并将其存储在稍后要重用的实例上,但不会写入数据库。