序列化时,SQLAlchemy外连接不显示嵌套数据

时间:2019-04-10 12:31:15

标签: python sqlalchemy marshmallow

我有2个SQLAlchemy模型和一些与它们相关的marshmellow-sqlalchemy模式:

from sqlalchemy import Column, Integer, VARCHAR, ForeignKey, Float, TIMESTAMP, DATE, TEXT, BOOLEAN, SMALLINT, DECIMAL, BIGINT
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import relationship, backref
from marshmallow_sqlalchemy import ModelSchema
from marshmallow import fields

Base = declarative_base()


class ABC(Base):
    __tablename__ = "abc"
    id = Column(Integer(), primary_key=True)
    key = Column(TEXT())
    user_id = Column(TEXT())
    user_name = Column(VARCHAR())
    user_email = Column(VARCHAR())
    ref_id = Column(Integer())

    external = relationship('REF', backref=backref('abc', uselist=False))  # <-- added uselist later to try out one of the possible solutions


class REF(Base):
    __tablename__ = "ref"
    ref_id = Column(Integer(), primary_key=True)
    id= Column(Integer(), ForeignKey('abc.id'))
    score = Column(VARCHAR())
    date = Column(DATE())


class REFSchema(ModelSchema):
    class Meta:
        model = REF

class ABCSchema(ModelSchema):
    class Meta:
        model = ABC

class ABCWithREFSchema(ModelSchema):
    external = fields.Nested(REFSchema)
    class Meta:
        model = ABC

我想在某些条件下执行ABC left outer join REF。我这样做:

result = session.query(ABC).outerjoin(REF, ABC.ref_id == REF.ref_id).filter(<some conditions>).all()

注意:我正在除已定义键关系的列之外的其他列上执行联接。

这会正确输出ABC中的数据,但是external字段中不会填充符合联接条件的数据。

我尝试序列化数据的方式如下:

schema = ABCWithREFSchema()
for i in result:
    dump_data = schema.dump(i).data
    print dump_data

dump_data包含ABC中的所有数据,但它包含字段external作为空字典。这不会发生,因为对数据库的原始查询表明,ABC的一行和REF的一行满足了连接条件(这是一对一关系)。

我尝试了一件事。我给了many=True

class ABCWithREFSchema(ModelSchema):
    external = fields.Nested(REFSchema, many=True)  # <-- HERE
    class Meta:
        model = ABC

这会将空external字典更改为包含REF表中的所有行,就好像它忽略了我要执行连接的条件一样。这可能是什么问题?

类和模式是具有相同结构的副本。由于机密性,我无法输入实际的代码。由于我是SQLAlchemy的新手,所以我可能错过了一些相关文档。对此我感到抱歉。

0 个答案:

没有答案