首页 > 解决方案 > 如何将 SQLAlchemy 查询转换为嵌套字典?

问题描述

我有三个SQLalchemy表,它们之间具有一对多的关系。我将我的表定义如下:

汽车 -> 图像 1:n 和图像 -> CarPart 1:n

class Car(Base):
    __tablename__ = 'cars'

    car_id = Column(String(36), primary_key=True)
    license_plate = Column(String(12))

    def __init__(self, car_id=None, license_plate=None):
        self.car_id = car_id
        self.license_plate = license_plate


class Image(Base):
    __tablename__ = 'images'

    image_id = Column(String(36), primary_key=True)
    car_id = Column(ForeignKey('cars.car_id'))
    angle = Column(String(12))

    car = relationship('Car', uselist=True)

    def __init__(self, image_id=None, car_id=None, angle=None):
        self.image_id = image_id
        self.car_id = car_id
        self.angle = angle


class CarPart(Base):
    __tablename__ = 'car_parts'

    part_id = Column(String(36), primary_key=True)
    car_id = Column(ForeignKey('cars.car_id'))
    image_id = Column(ForeignKey('images.image_id'))
    part_type = Column(String(20))

    car = relationship('Car', uselist=True)
    image = relationship('Image', uselist=True)

    def __init__(self, part_id=None, car_id=None, image_id=None, part_type=None):
        self.part_id = part_id
        self.car_id = car_id
        self.image_id = image_id
        self.part_type = part_type

如果我对特定的car_idor进行查询license_plate,使用db.query(Car, Image, CarPart)我想在嵌套字典中接收属于该汽车的所有信息,例如

{
        'car_id': '001',
        'license_plate': 'AA-000-B'
        'images': [{
                'image_id': '0001',
                'angle': 'front',
                'car_parts': [{
                        'part_id': '00001',
                        'part_type': 'bumper'
                        },
                        {
                        'part_id': '00002',
                        'part_type': 'window'
                        }]
                },
                {
                'image_id': '0002'
                'angle': 'rear'
                'car_parts': [{
                        'part_id': '00003',
                        'part_type': 'door'
                        },
                        {
                        'part_id': '00004',
                        'part_type': 'wheel'
                        }]
                }]
        }
}

我希望在 SQLAlchemy 中找到一些可以做到这一点的内置方法,但到目前为止我找不到它。有没有什么好的,简洁的方法可以做到这一点?还是我要db.query().all()手动转换返回字典的列表?

标签: pythondictionarysqlalchemy

解决方案


通过在表定义中添加一个字段,我能够在执行查询时获得一个嵌套结构。在我的表定义中,我现在有:

class Car(Base):
    __tablename__ = 'cars'

    car_id = Column(String(36), primary_key=True)
    license_plate = Column(String(12))
    car_images = relationship('Image', back_populates=True)

    def __init__(self, car_id=None, license_plate=None):
        self.car_id = car_id
        self.license_plate = license_plate

和其他表中的类似。这将为我提供嵌套列表,可以轻松地将其转换为嵌套字典。


推荐阅读