1

宣言型のアプローチでは、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プロパティに値を割り当てても、データベースでSequenceNoプロパティが更新されないようにします。そのため、exclude_propertiesを使用しましたが、それでもdbの値を更新しています。しかし、プロパティ名をSequenceNoからSequence_No(列名と同じ)に変更すると、動作どおりに機能します。誰か助けてもらえますか?

ありがとうAdhi

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 に答える