我目前正在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个对象创建一个子句,然后发出查询,直到所有对象都处理完为止)。在
想看看有没有更好的方法。在
目前没有回答
相关问题 更多 >
编程相关推荐