使用加入 Peewee 删除 table 中的多条记录?

Deleting multiple records in a table using join in Peewee?

由于 Peewee 中的 "delete" 查询不允许加入,删除 table_2 中与相关 table_1 中的特定条件匹配的所有记录的最佳方法是什么?

使用一个简单的例子,我想实现与此等效的:

  DELETE message.*
  FROM message
  JOIN user ON message.from_user_id = user.id
  WHERE user.name = "Joe";

你应该对这种类型的东西使用子查询,例如:

joe = User.select().where(User.username == 'Joe')
Message.delete().where(Message.from_user == joe).execute()

假设您要删除来自 "banned" 位用户的所有消息。你可以这样写:

banned_users = User.select().where(User.is_banned == True)
Message.delete().where(Message.user.in_(banned_users)).execute()

如果您使用的是 Postgresql,则可以使用带有 USING clause

的原始查询
name_to_delete = 'Joe'
query = Message.raw("""
    DELETE FROM message 
        USING user 
    WHERE 
        message.from_user_id = user.id AND
        user.name = %s
""", name_to_delete)
query.execute()