这就是我的问题,我有以下表格:
class ClientCampaings(Base):
__tablename__ = 'client_campaign'
campaign_id = Column(INTEGER, primary_key=True)
client_id = Column(VARCHAR(50))
campaign_name = Column(VARCHAR(45))
campaign_status = Column(VARCHAR(45))
campaign_type = Column(VARCHAR(45))
registration_date = Column(DATE)
class ClientKpi(Base):
__tablename__ = 'client_kpi'
kpi_id = Column(INTEGER, primary_key=True)
kpi_name = Column(VARCHAR(45))
cost_conv = Column(FLOAT)
quality_score = Column(FLOAT)
class KpiAssigment(Base):
__tablename__ = 'kpi_assigment'
assigment_id = Column(INTEGER, primary_key=True)
kpi_id = Column(INTEGER, ForeignKey("client_kpi.kpi_id"))
campaign_id = Column(INTEGER, ForeignKey("client_campaign.campaign_id"))
assigned_by = Column(VARCHAR(45))
timestamp = Column(TIMESTAMP)
#Basic One To Many relation
client_campaign = relationship("ClientCampaings")
client_kpi = relationship("ClientKpi")
我对他们进行以下查询:
from database.session import MySqlConnection
from database.models import KpiAssigment,ClientKpi
db = MySqlConnection(database='db_goes_here').db_session()
kpi=db.query(KpiAssigment)\
.join(ClientKpi)\
.filter(KpiAssigment.kpi_id==ClientKpi.kpi_id).all()
我原以为会是这样的:
SELECT kpi_assigment.*,
client_kpi.*
FROM kpi_assigment
INNER JOIN client_kpi
ON kpi_assigment.kpi_id=client_kpi.kpi_id
但是,当我运行SqlAlChemy查询时,我只得到第一个表的结果:
{'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x7fb3d0ace910>, 'kpi_id': 1, 'assigned_by': 'xxx@email.net', 'assigment_id': 2, 'campaign_id': XXXXXXXXX, 'timestamp': datetime.datetime(2022, 12, 7, 17, 5, 8)}
我希望得到一个内部联接,也有来自ClientKpi表的数据。
我读了这些相关的问题,但仍然找不到为什么这不起作用
SqlAlchemy Outer Join Only Returns One Table
How to join data from two tables in SQLAlchemy?
我确实遵循了他们的文档
Https://docs.sqlalchemy.org/en/14/orm/query.html#sqlalchemy.orm.Query.join
有什么想法吗?
谢谢
2条答案
按热度按时间xtfmy6hx1#
该查询
将仅选择
KpiAssignemnt
表;要选择相应的ClientKpi
,请在query
中包括ClientKpi
型号:.filter
是多余的,因为SQLAlChemy将使用声明的外键来创建JOIN
。如果要循环遍历每个父对象的子对象,则可以使用没有显式联接的关系:
dffbzjpn2#
我还在试着找出是否有更好的回应,同时,我做了以下事情,并得到了我想要的:
它返回具有元组列表的结果: