SQLAlchemy:多个表和联接,重复行

2024-09-30 01:30:08 发布

您现在位置:Python中文网/ 问答频道 /正文

[我觉得这也许/肯定(?)不过,一个复制品,我已经找了一整天来找到这个问题的解决方案,但似乎我无法让它按照我想要的方式工作。]

在MySQL中,我有三个表,分别命名为ecordov(A)、ecordovadr(B)和ecrgposvk(C)。 我有一个键连接所有这些;在(A)每个键有一行,(B)和(C)每个键可能有多行,所以,如果不是这些问题的专家,我认为这是一对多的关系。在

我阅读了SQLAlchemy文档,并将我的表设置为:

class Ecordov(Base):

    __tablename__ = 'ecordov'

    oovkey = Column(BIGINT, primary_key=True)
    oovorder = Column(BIGINT)
    ecordovadr = relationship('Ecordovadr')
    ecrgposvk = relationship('Ecrgposvk')


class Ecordovadr(Base):

    __tablename__ = 'ecordovadr'

    ooakey = Column(BIGINT, primary_key=True)
    ooaname1 = Column(VARCHAR)
    ooaorder = Column(BIGINT, ForeignKey('ecordov.oovorder'))


class Ecrgposvk(Base):

   __tablename__ = 'ecrgposvk'

   rgkey = Column(BIGINT, primary_key=True)
   rgposvalue = Column(DOUBLE)
   rgposordnum = Column(BIGINT, ForeignKey('ecordov.oovorder'))

[所以,正如您所见,ForeignKeys不是{},不确定这是否是个问题?但是,我无法更改数据库的结构。]

我的示例查询如下:

^{pr2}$

计算结果为:

SELECT ecordov.oovkey AS ecordov_oovkey, ecordov.oovorder AS ecordov_oovorder, group_concat(ecordovadr.ooaname1 ORDER BY ecordovadr.ooatype, ecordovadr.ooarank separator "{}") AS ooaname1 
FROM ecordov LEFT OUTER JOIN ecordovadr ON ecordov.oovorder = ecordovadr.ooaorder 
WHERE ecordov.oovorder LIKE '75289'
GROUP BY ecordov.oovorder

给我的是:

for x in jobs:
    x.ooaname1

u'Sorbe priv.{}Lebensn\xe4he GmbH'

这是我想要的结果。在

但是,在连接第二个表之后,不管使用的是内部连接还是外部连接,例如:

jobs = session.query(Ecordov, func.group_concat(Ecordovadr.ooaname1.op('ORDER BY')(text('ecordovadr.ooatype, ecordovadr.ooarank separator "{}"'))).label('ooaname1')).outerjoin(Ecordovadr).outerjoin(Ecrgposvk).filter(Ecordov.oovorder.like('75289')).group_by(Ecordov.oovorder)

其计算结果为:

SELECT ecordov.oovkey AS ecordov_oovkey, ecordov.oovorder AS ecordov_oovorder, group_concat(ecordovadr.ooaname1 ORDER BY ecordovadr.ooatype, ecordovadr.ooarank separator "{}") AS ooaname1 
FROM ecordov LEFT OUTER JOIN ecordovadr ON ecordov.oovorder = ecordovadr.ooaorder LEFT OUTER JOIN ecrgposvk ON ecordov.oovorder = ecrgposvk.rgposordnum 
WHERE ecordov.oovorder LIKE '75289'
GROUP BY ecordov.oovorder

给我:

for x in jobs:
    x.ooaname1

u'Sorbe priv.{}Sorbe priv.{}Sorbe priv.{}Lebensn\xe4he GmbH{}Lebensn\xe4he GmbH{}Lebensn\xe4he GmbH'

所以,数据现在增加了三倍。我在其他关于这个主题的线程中读到,这是意料之中的,特别是当对多个表使用相同的ForeignKey时。在

但我需要“像以前一样”的数据,这意味着只有一个条目,而不是三个条目。我尝试过使用distinct(),但到目前为止没有成功。在

有人能给我指一个方向吗?怎么解决这个问题?在

提前谢谢,祝你一切顺利!在


Tags: byasgroupcolumnprivbigintecordovooaname1

热门问题