1

私は、別のクラスと1対多の関係にあるいくつかのオブジェクトを読み取る必要があるライブラリで作業しています。次のコードは、私のライブラリのコードの非常に単純化されたバージョンを表しています。

class Plan(Base):
  __tablename__ = 'plan'
  id = Column(Integer, primary_key=True)
  name = Column(String)

  points = relationship('Point')

  def __init__(self,name):
    self.name = name


class Point(Base):
    __tablename__ = 'point'

    id          = Column(Integer, primary_key=True)
    coordinates = Column(String)
    plan_id     = Column(Integer,ForeignKey('plan.id'))

    def __init__(self, coordinates):
        self.coordinates = coordinates

関係のすべてのデータ(上記の例のすべてのポイント)を読み取り、すべてのポイントで操作を実行して、次のオブジェクト(例のPlanクラスのオブジェクト)に進む必要があります。各プランのポイント数が多いため、メモリ内のすべてのデータをロードできないため、プランに関連するポイントオブジェクトを使用して操作を完了した後(後で必要ない)に実行したいと思います。操作)、それらをアンロードし、次の計画でプロセスを続行します。私は次のアプローチを試しました:

plan.points = []

また

for point in plan.points:
  plan.points.remove(point)

ただし、これらの各アプローチは、更新または削除クエリをスタックします(カスケード属性が関係でどのように設定されているかに応じて)。これは、プロセスにかなりのオーバーヘッドがあり、合計実行時間が2または3増加し、潜在的に有害なSQL操作をスタックすることを意味します。セッションがコミットされます。

これらのUPDATE/DELETEクエリを生成せずにオブジェクトをアンロードする方法と実行時間の増分はありますか?

4

1 に答える 1

0

デフォルトでは、オブジェクトは弱参照Sessionを使用してのみ保存されます。つまり、オブジェクトへの独自の参照を削除するだけで、メモリからオブジェクトをクリアできます。

Session.expunge_all()とは言うものの、セッションでまだ保持されているものを削除するために自由に電話をかけることができます。コミットする必要のある変更がある場合は、これを呼び出さないでくださいSession.flush()。最初に発行してください。

このメソッドPointを使用して、個々のオブジェクトを消去することもできます。Session.expunge()

詳細については、セッションの使用を参照してください。

于 2013-03-26T14:52:50.153 に答える