9

ですから、私はSQLAlchemyにまったく慣れていません。

テーブルに約10,000行あるモデルShowingがあります。クラスは次のとおりです。

class Showing(Base):
    __tablename__   = "showings"

    id              = Column(Integer, primary_key=True)
    time            = Column(DateTime)
    link            = Column(String)
    film_id         = Column(Integer, ForeignKey('films.id'))
    cinema_id       = Column(Integer, ForeignKey('cinemas.id'))

    def __eq__(self, other):
        if self.time == other.time and self.cinema == other.cinema and self.film == other.film:
            return True
        else:
            return False

新しいショーがまだ存在しない場合に挿入するための最速の方法について、誰かが私にいくつかのガイダンスを教えてもらえますか?時間、シンメア、映画が上映でユニークである場合にのみ上映がユニークになるので、少し複雑だと思います。

私は現在このコードを持っています:

def AddShowings(self, showing_times, cinema, film):
    all_showings = self.session.query(Showing).options(joinedload(Showing.cinema), joinedload(Showing.film)).all()
    for showing_time in showing_times:
        tmp_showing = Showing(time=showing_time[0], film=film, cinema=cinema, link=showing_time[1])
        if tmp_showing not in all_showings:
            self.session.add(tmp_showing)
            self.session.commit()
            all_showings.append(tmp_showing)

これは機能しますが、非常に遅いようです。どんな助けでも大歓迎です。

4

1 に答える 1

17

そのようなオブジェクトが列の組み合わせに基づいて一意である場合は、それらを複合主キーとしてマークする必要があります。primary_key=Trueこれらの各列にキーワードパラメータを追加し、id列を完全に削除します。

class Showing(Base):
    __tablename__   = "showings"

    time            = Column(DateTime, primary_key=True)
    link            = Column(String)
    film_id         = Column(Integer, ForeignKey('films.id'), primary_key=True)
    cinema_id       = Column(Integer, ForeignKey('cinemas.id'), primary_key=True)

そうすれば、データベースはこれらの行をより効率的に処理でき(列をインクリメントする必要はありません)、SQLAlchemyはの2つのインスタンスShowingが同じものであるかどうかを自動的に認識します。

そうすれば、新しいものをセッションにマージして戻すことができると思います。Showing

def AddShowings(self, showing_times, cinema, film):
    for showing_time in showing_times:
        self.session.merge(
            Showing(time=showing_time[0], link=showing_time[1],
                    film=film, cinema=cinema)
        )
于 2012-09-06T10:43:20.250 に答える