对于SQL专家来说。如何获取Peewee中7个表的值?

2024-06-26 01:49:07 发布

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

有可能得到必要的查询吗?他花了三天时间试图解决这个问题,向同事征求意见,但毫无帮助

我有一些皮维模型列在下面

class Owner(pw.Model):
    id = pw.UUIDField()
    name = pw.TextField()
 
class House(pw.Model):
    id = pw.UUIDField()
    owner = pw.ForeignKeyField(Owner)
    build_end = pw.DateTimeField()
    account = pw.ForeignKeyField(AccountData)

class AccountData(pw.Model):
    id = pw.UUIDField()
    version = pw.IntegerField()
    full_access = pw.ManyToManyField(Access)
    part_access = pw.ManyToManyField(Access)

class AccountFullAccess(pw.Model):
    id = pw.UUIDField()
    account = pw.ForeignKeyField(AccountData)
    access = pw.ForeignKeyField(Access)

class AccountPartAccess(pw.Model):
    id = pw.UUIDField()
    account = pw.ForeignKeyField(AccountData)
    access = pw.ForeignKeyField(Access)
    
class Access(pw.Model):
    id = pw.UUIDField()
    version = pw.ForeignKeyField(AccessVersion)
    access_id = pw.IntegerField()
    
class Cat(pw.Model):
    id = pw.UUIDField()
    access = pw.ForeignKeyField(Access, unique=True, null=True)
    access_v2 = pw.ForeignKeyField(Access, unique=True, null=True)

class AccessVersion(pw.Model):
    id = pw.UUIDField()
    version = pw.SmallIntegerField(choices=(1, 2))

class OwnerCats(pw.Model):
    owner = pw.ForeignKeyField(Owner)
    cat = pw.ForeignKeyField(Cat)

我得把许多桌子主人的猫填满。 对于每个业主,我只得到最后建造的一栋房子(House.build\u end)。 每家每户都有一个账户。 每个AccountData都有完全访问和部分访问权限列表。 这些关系存储在AccountFullAccess和AccountPartAccess许多表中。 每个访问都与Cat有关。 有两个版本:第一和第二。版本2的访问权限只能存储在Cat.Access_v2中

我在这一点上停了下来。但我没有足够的价值观。所以,这个查询是错误的

latest_houses = House.select(
    House.id
).where(
    House.account_id.is_null(False)
).order_by(
    House.owner_id,
    House.build_end.desc()
).distinct(
    House.owner_id
).dicts()

AccessAlias = Access.alias()

account_full_access = Cat.select(
    House.id.alias('house_id'),
    Cat.id.alias('cat_id'),
    House.owner_id.alias('owner_id'),
    Access.access_id,
    AccessAlias.access_id.alias('access_id_v2'),
).join(
    Access,
    on=(Cat.access == Access.id)
).switch(
    Cat
).join(
    AccessAlias,
    on=(Cat.access_v2 == AccessAlias.id)
).join(
    AccountFullAccess
).join(
    AccountData
).join(
    House
).where(
    (House.account_id.is_null(False))
    & (Access.access_id.is_null(False))
    & (AccessAlias.access_id.is_null(False))
    & (House.id << latest_houses)
).dicts()

我使用相同的查询,但我将AccountFullAccess更改为AccountPartAccess。因此,我需要Access元素,通过AccountFullAccess和AccountPartAccess连接


Tags: idmodelaccessaccountnullclasscathouse