何时更新记录——在查询迭代期间还是之后



我读到,将整个表作为对象返回要比简单地返回所需字段花费更长的时间。但是,我当前运行的查询返回一个表对象和其他表中的几个其他字段。我这样做是因为当我遍历查询结果时,我可以根据查询结果更新表对象。我的理解是,如果我只是返回我想要的字段,那么它将作为一个命名元组返回,在这里我不能编辑属性。这意味着我必须遍历查询结果,然后使用id字段重新查询数据库,以逐个更新记录。

作为我目前方法的一个简化示例:

matches = dal.session.query(Table1, Table2.date))
matches = matches.join(Table2, Table2.id_.__eq__(Table1.table1_id))
for m in matches:
if m.date > m.Table1.date:
m.Table1.more_recent_date = 1
dal.session.commit()

不返回表对象的另一种选择是:

matches = dal.session.query(Table1.id_, Table2.date))
matches = matches.join(Table2, Table2.id_.__eq__(Table1.table1_id))
for m in matches:
table1 = dal.session.query(Table1).filter(Table1.id_.__eq__(m.id_))
if m.date > table1.date:
table1.more_recent_date = 1
dal.session.commit()

我正试着弄清楚哪种方法是最好的。我所说的"最好"实际上是指最快,因为Table1中有数百万条记录(也有100多个字段(,Table2中有数万条记录。当然,除非还有其他我不知道的重要考虑因素。我可以为这两种方法计时,但我想我应该先在这里问一个问题。你们通常很善于告诉我这两种方式都是垃圾,还有更好的第三种方式:-(

我应该提到的是,我之所以在现有记录的基础上更新添加新记录,是因为最终会有35-40条不同类型的新记录,其中一些记录需要很长时间才能计算出来(上面的日期示例只是一个简单的示例(。为了节省将来的时间,我想"设计"这些记录并存储它们,而不是每次都从查询中创建它们。

提前谢谢。

正如您所注意到的,测量是确保的唯一方法。

一般来说,你最大的时间成本可能是往返数据库的次数;如果每个查询中的列数很明显的话,那么它的影响可能会小得多。

根据您稍后对它所做的操作,是否要将more_recent_date信息存储在数据库中也是一个问题;如果它是一个临时变量,您可以将其存储在内存中(作为table1对象的列表或table1.id数字的集合(,或者立即将其用于计算(例如,保持一个连续的总数,而不是标记记录然后求和(。

最新更新