我目前正在使用peewee作为python项目中的ORM。 我试图确定给定一组对象,如果数据库中已存在任何这些对象。对于唯一性基于一个简单的键的对象 - 我可以生成一个键列表并在数据库中进行选择:
Model.select().where(Model.column << ids)
但是,在某些情况下,唯一性由两列确定。 (请注意,此刻我还没有掌握主键,这就是为什么我不能依赖id
。)
我尝试对逻辑进行泛化,其中可以传入确定唯一性的所有列名列表。这是我的代码:
clauses = []
for obj in db_objects:
# get_unique_key returns a tuple of the all the column values
# that determine uniqueness for this object.
uniq_key = self._get_unique_key(obj)
subclause = [getattr(self.model_class, uniq_column) == value
for uniq_column, value in zip(self.uniq_columns, uniq_key)]
clauses.append(reduce(operator.and_, subclause))
dups = self.model_class.select().where(reduce(operator.or_, clauses)).execute()
请注意,self.dup_columns
包含一起确定唯一性的所有列的名称,_get_unique_key
返回这些列值的元组。
当我运行此操作时,我收到一个错误,即超出了最大递归深度。我想这是因为peewee如何解析表达式。绕过它的一种方法可能是将我的子句分解为一些最大数量的对象(即为每100个对象创建一个子句,然后发出查询,并执行此操作直到所有对象都被处理完毕。)
想要看看是否有更好的方法。