【问题标题】:Fastest way to insert object if it doesn't exist with SQLAlchemy如果 SQLAlchemy 不存在对象,则插入对象的最快方法
【发布时间】:2012-08-31 02:25:03
【问题描述】:

所以我对 SQLAlchemy 还是很陌生。

我有一个模型 Showing,它的表中有大约 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

如果新节目尚不存在,谁能给我一些关于插入新节目的最快方法的指导。我认为它稍微复杂一些,因为只有在时间、电影和电影在放映中是独一无二的情况下,放映才是独一无二的。

我目前有这个代码:

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)

这可行,但似乎很慢。非常感谢任何帮助。

【问题讨论】:

    标签: python mysql sqlalchemy


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-07
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多