Cel mai rapid mod de a insera obiect în cazul în care nu există cu SQLAlchemy

voturi
3

Deci, eu sunt destul de nou la SQLAlchemy.

Am un model care are aproximativ Afișează 10.000 de rânduri în tabel. Aici este clasa:

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

Ar putea cineva să-mi dea unele indicații cu privire la cel mai rapid mod de a insera un nou care arată în cazul în care nu există deja. Cred că este puțin mai complicată, deoarece este un indicator care arată numai unic în cazul în care timp, cinmea, și filmul sunt unice pe un rezultat.

Am în prezent, acest cod:

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)

care funcționează, dar pare a fi foarte lent. Orice ajutor este apreciat.

Întrebat 06/09/2012 la 08:37
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
4

Dacă un astfel de obiect este unic , bazat pe o combinație de coloane, aveți nevoie pentru a marca aceste ca o cheie primară compozit. Adăugați primary_key=Trueparametrul cuvânt cheie pentru fiecare dintre aceste coloane, scăzând dvs. idcoloană cu totul:

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)

În acest fel , baza de date se pot ocupa aceste rânduri mai eficient (nu este nevoie de o coloană de incrementare), iar SQLAlchemy acum știe în mod automat în cazul în care două instanțe ale Showingsunt același lucru.

Eu cred că vă puteți apoi doar îmbinați noul dvs. Showingînapoi în sesiune:

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)
        )
Publicat 06/09/2012 la 09:43
sursa de către utilizator

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more