toluaina/pgsync

QueryBuilder fails when faces 3 layer deep relationships of certain kind

MeRuslan opened this issue · 2 comments

PGSync version:
2.3.3

Postgres version:
NA

Elasticsearch version:
NA

Redis version:
NA

Python version:
NA

Problem Description:
When there's base - one-to-one child - one to many with through kind of relationship, pgsync calls _non_through path for the one-to-one child which in turn tries to handle the one to many with through (which is a child of a first level one-to-one child) connection but fails,

It fails here, fails to find foreign keys
foreign_key_columns: list = self._get_column_foreign_keys( child._subquery.columns, foreign_keys, )

Maybe self._get_column_foreign_keys is not thorough enough to correctly link these entities in such a case.

Thus rendering pgsync not usable for that kind of a schema.

Not sure where exactly to fix it.

Error Message (if any):

    for i in range(len(foreign_key_columns)):
TypeError: object of type 'NoneType' has no len()

After giving it another look, it seems like table argument should be passed there, in which case it would resolve correctly.

            table = (
                child.relationship.throughs[0].table if child.relationship.throughs
                else None
            )
            foreign_key_columns: list = self._get_column_foreign_keys(
                child._subquery.columns,
                foreign_keys,
                table=table,
                schema=node.schema,
            )

That simple correction worked for me.
Would appreciate it if you @toluaina could have had a look.

working on a pr