我有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
的新手,所以我可能错过了一些相关文档。对此我感到抱歉。