如果对象不存在于SQLAlchemy中,则以最快的方式插入该对象

2024-10-17 06:29:06 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我对SQLAlchemy很陌生。

我有一个模型显示表中大约有10000行。这是课堂:

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)

这很有效,但似乎很慢。任何帮助都非常感谢。


Tags: selfidtimesessioncolumnintegerall节目
1条回答
网友
1楼 · 发布于 2024-10-17 06:29:06

如果任何此类对象基于列的组合是唯一的,则需要将它们标记为组合主键。将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)
        )

相关问题 更多 >