在声明方法中,我想排除一个属性,当我的列名和属性名相同时,它正常工作。但如果我给出不同的名字,那么它就不起作用了。 这是我的示例代码。
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
答案 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
属性拦截写入并将其存储在稍后要重用的实例上,但不会写入数据库。