SQLAlchemy:多个表和连接,重复的行

时间:2015-07-06 12:39:29

标签: python join sqlalchemy duplicates multiple-tables

[我觉得这可能/肯定(?)是重复的,但是,我一整天都在搜索找到解决方案,似乎我无法让它按顺序运行我想自己。]

在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不是primary_key(s),不确定这是不是问题?但是,我无法改变数据库的结构。]

我的示例查询如下:

jobs = session.query(Ecordov, func.group_concat(Ecordovadr.ooaname1.op('ORDER BY')(text('ecordovadr.ooatype, ecordovadr.ooarank separator "{}"'))).label('ooaname1')).outerjoin(Ecordovadr).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 
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时。

但我需要这些数据"就像之前的#34;,这意味着只有一个条目,而不是三个条目。我尝试使用distinct()但到目前为止没有成功。

有人可以指点我一个方向,如何解决这个问题?

提前致谢并且一切顺利!

0 个答案:

没有答案