Peewee选择不存在子元素的元素

时间:2018-06-20 00:11:34

标签: python python-3.x orm peewee

我正在使用包含计算机及其进程的数据库进行操作。

我想选择缺少名称为“ proc”的进程的计算机。

在下面查看我的尝试

from peewee import *

mysql_db = MySQLDatabase('dbname', host='host', port=3306, passwd='passwd')

class BaseModel(Model):
    class Meta:
        database = mysql_db

class Computers(BaseModel):
    computerid = IntegerField(primary_key = True)
    name = CharField()

class Processes(BaseModel):
    processid = BigIntegerField(primary_key = True)
    computerid = ForeignKeyField(Computers, backref = 'processes', db_column='computerid')
    name = CharField()

mysql_db.connect()

proc_computers = (Computers
        .select(Computers, Processes)
        .join(Processes)
        .where(Processes.name == 'proc')
        )

non_proc_computers = (Computers
            .select()
            .where(Computers.computerid.not_in(lttray_computers))
            )

这将导致peewee.InternalError: (1241, 'Operand should contain 1 column(s)')

有人可以指出我似乎做错了什么吗?我正在尝试遵循以下文档:http://docs.peewee-orm.com/en/latest/peewee/query_operators.html

有更好的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

可能您想使用EXISTS:

subq = Process.select().where(
    (Process.name == 'proc') &
    (Process.computer == Computer.id))

query = Computer.select().where(~fn.EXISTS(subq))

注意:最佳实践是不要对模型类使用复数形式。同样,请勿在字段名称中包含“ xxx_id”。