Peewee动态生成where子句以检查重复项

时间:2017-05-20 22:50:51

标签: python mysql peewee

我目前正在使用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个对象创建一个子句,然后发出查询,并执行此操作直到所有对象都被处理完毕。)

想要看看是否有更好的方法。

0 个答案:

没有答案