2012-09-06 36 views
3

所以我很新的SQLAlchemy。插入對象的最快方法,如果它不存在與SQLAlchemy

我有一個模型顯示其中有約10,000行在表中。這裏是該類:

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 

任何人都可以給我一些指導,如果它不存在已插入新的顯示最快的方式。我認爲它稍微複雜一些,因爲如果時間,cinmea和電影在展示中獨一無二,那麼展示纔是唯一的。

我現在有這樣的代碼:

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

如果任何此類對象基於列的組合是唯一的,則需要將這些對象標記爲組合主鍵。在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的現在自動知道如果兩個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) 
     ) 
+0

謝謝!它工作完美,約x100更快! – user1110718

相關問題