繁体   English   中英

如何在没有外键的情况下使用 PeeWee 进行左外连接?

[英]How to do left outer join with PeeWee and no ForeignKey?

在 SQLite 之上使用 PeeWee,我试图在两个没有定义 ForeignKey 关系的表之间进行左外连接。 如果右表的条目与左表匹配,我可以获得数据,但如果不匹配,则右表中的列不会进入返回的模型。

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

class Location(BaseModel):
    location_key = CharField(primary_key=True)
    lat = FloatField(null = False)
    lon = FloatField(null = False)


class Household(BaseModel):
    name = CharField(null=True)
    location_id = CharField(null=True)

我正在尝试做类似的事情:

    for h in Household.select(Household,Location).join(Location, on=(Household.location_id == Location.location_key), join_type=JOIN.LEFT_OUTER):
        print(type(h), h, h.location, h.location.lat)

如果 Household.location_id 与 Location 中的某些内容匹配,则此方法有效,但如果 Household.location_id 为无(null),则我得到一个AttributeError: 'Household' object has no attribute 'location'

我本来希望位置存在,但没有有效。

如何在使用前检查位置是否存在? 我试图避免使用 ForeignKey,Household.location_id 和 Location.location_key 之间存在很多不匹配,PeeWee对此非常生气......

我想我明白你重读后想做什么。 我的建议是在连接中使用 Peewee 的“on”关键字参数,它可以将相关位置(如果存在)修补到与“位置”不同的属性上:

query = (HouseHold
         .select(HouseHold, Location)
         .join(Location, on=(HouseHold.location_id == Location.location_key),
               attr='location_obj', join_type=JOIN.LEFT_OUTER))

然后您可以检查“location_obj”以检索相关的 object。

for house in query:
    # if there was a match, get the location obj or None.
    location_obj = getattr(house, 'location_obj', None)
    # the location_id is still present.
    print(house.location_id, location_obj)

找到了我自己的答案。 在 Household model 中实现__getattr__(self) ,如果名称为 'location' 则返回 None。 __getattr__(self)只有在没有具有该名称的属性时才会被调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM