gpt4 book ai didi

python - 如果 SQLAlchemy 不存在对象,则插入对象的最快方法

转载 作者:可可西里 更新时间:2023-11-01 07:53:33 27 4
gpt4 key购买 nike

所以我对 SQLAlchemy 还很陌生。

我有一个模型 Showing,它在表中有大约 10,000 行。这是类(class):

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)

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

最佳答案

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

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)
)

关于python - 如果 SQLAlchemy 不存在对象,则插入对象的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12297156/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com