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

2024-06-01 02:17:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在python项目中使用peewee作为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个对象创建一个子句,然后发出查询,直到所有对象都处理完为止)。在

想看看有没有更好的方法。在


Tags: 对象keyself数据库列表forgetmodel