0

From a large database, I generated the sqlalchemy classes using sqlacodegen. I can open a session but printing the rows of a table results in sort of infinite loop, sqlalchemy just hangs.

Here is a much reduced version of the classes to illustrate:

# some declarations here

@mapper_registry.mapped
@dataclass
class clsA:
    __tablename__ = 'clsa'
    __table_args__ = (
        PrimaryKeyConstraint('id', name='clsa_pkey'),
    )
    __sa_dataclass_metadata_key__ = 'sa'

    id: int = field(init=False, metadata={'sa': Column(Integer)})

    to_clsb: List[clsB] = field(default_factory=list, metadata={'sa': relationship('clsB', back_populates='to_clsa')})

@mapper_registry.mapped
@dataclass
class clsB:
    __tablename__ = 'clsb'
    __table_args__ = (
        ForeignKeyConstraint(['clsc_id'], ['clsc.id'], name='clsb_fk_clsc'),
        ForeignKeyConstraint(['clsa_id'], ['clsa.id'], name='clsb_fk_clsa'),
        PrimaryKeyConstraint('id', name='clsb_pkey')
    )
    __sa_dataclass_metadata_key__ = 'sa'

    id: int = field(init=False, metadata={'sa': Column(Integer)})
    clsc_id: int = field(metadata={'sa': Column(Integer, nullable=False, index=True)})
    clsa_id: int = field(metadata={'sa': Column(Integer, nullable=False, index=True)})

    to_clsc: Optional[clsC] = field(default=None, metadata={'sa': relationship('clsC', back_populates='to_clsb')})
    to_clsa: Optional[clsA] = field(default=None, metadata={'sa': relationship('clsA', back_populates='to_clsb')})
    
@mapper_registry.mapped
@dataclass
class clsC:
    __tablename__ = 'clsc'
    __table_args__ = (
        PrimaryKeyConstraint('id', name='clsc_pkey'),
    )
    __sa_dataclass_metadata_key__ = 'sa'

    id: int = field(init=False, metadata={'sa': Column(Integer)})

    to_clsb: List[clsB] = field(default_factory=list, metadata={'sa': relationship('clsB', back_populates='to_clsc')})

To test it I use the following

# some declarations here

engine = create_engine('postgresql+psycopg2://', connect_args=args)
Session = sessionmaker(bind=engine)
session = Session()
qs = session.query(clsC).all()

for q in qs:
    print(q)

When I reach the print(q), I do not get anything, and the program doesn't stop.

Curiously, it works if I remove the relationship between clsA and clsB.

Thanks for any hints.

user11634
  • 186
  • 2
  • 12

0 Answers0