def test_long_labels(self): dialect = default.DefaultDialect() dialect.max_identifier_length = 30 ora_dialect = oracle.dialect() m = MetaData() a_table = Table( "thirty_characters_table_xxxxxx", m, Column("id", Integer, primary_key=True), ) other_table = Table( "other_thirty_characters_table_", m, Column("id", Integer, primary_key=True), Column( "thirty_characters_table_id", Integer, ForeignKey("thirty_characters_table_xxxxxx.id"), primary_key=True, ), ) anon = a_table.alias() self.assert_compile( select([other_table, anon ]).select_from(other_table.outerjoin(anon)).apply_labels(), "SELECT other_thirty_characters_table_.id " "AS other_thirty_characters__1, " "other_thirty_characters_table_.thirty_char" "acters_table_id AS other_thirty_characters" "__2, thirty_characters_table__1.id AS " "thirty_characters_table__3 FROM " "other_thirty_characters_table_ LEFT OUTER " "JOIN thirty_characters_table_xxxxxx AS " "thirty_characters_table__1 ON " "thirty_characters_table__1.id = " "other_thirty_characters_table_.thirty_char" "acters_table_id", dialect=dialect, ) self.assert_compile( select([other_table, anon ]).select_from(other_table.outerjoin(anon)).apply_labels(), "SELECT other_thirty_characters_table_.id " "AS other_thirty_characters__1, " "other_thirty_characters_table_.thirty_char" "acters_table_id AS other_thirty_characters" "__2, thirty_characters_table__1.id AS " "thirty_characters_table__3 FROM " "other_thirty_characters_table_ LEFT OUTER " "JOIN thirty_characters_table_xxxxxx " "thirty_characters_table__1 ON " "thirty_characters_table__1.id = " "other_thirty_characters_table_.thirty_char" "acters_table_id", dialect=ora_dialect, )
def define_tables(cls, metadata): global Table1, Table1B, Table2, Table3, Data table1 = Table( "table1", metadata, Column("id", Integer, primary_key=True, test_needs_autoincrement=True), Column("related_id", Integer, ForeignKey("table1.id"), nullable=True), Column("type", String(30)), Column("name", String(30)), ) table2 = Table( "table2", metadata, Column("id", Integer, ForeignKey("table1.id"), primary_key=True), ) table3 = Table( "table3", metadata, Column("id", Integer, ForeignKey("table1.id"), primary_key=True), ) data = Table( "data", metadata, Column("id", Integer, primary_key=True, test_needs_autoincrement=True), Column("node_id", Integer, ForeignKey("table1.id")), Column("data", String(30)), ) # join = polymorphic_union( # { # 'table3' : table1.join(table3), # 'table2' : table1.join(table2), # 'table1' : table1.select(table1.c.type.in_(['table1', 'table1b'])), # }, None, 'pjoin') join = table1.outerjoin(table2).outerjoin(table3).alias("pjoin") # join = None class Table1(object): def __init__(self, name, data=None): self.name = name if data is not None: self.data = data def __repr__(self): return "%s(%s, %s, %s)" % ( self.__class__.__name__, self.id, repr(str(self.name)), repr(self.data), ) class Table1B(Table1): pass class Table2(Table1): pass class Table3(Table1): pass class Data(object): def __init__(self, data): self.data = data def __repr__(self): return "%s(%s, %s)" % ( self.__class__.__name__, self.id, repr(str(self.data)), ) try: # this is how the mapping used to work. ensure that this raises an # error now table1_mapper = mapper( Table1, table1, select_table=join, polymorphic_on=table1.c.type, polymorphic_identity="table1", properties={ "nxt": relationship( Table1, backref=backref("prev", foreignkey=join.c.id, uselist=False), uselist=False, primaryjoin=join.c.id == join.c.related_id, ), "data": relationship(mapper(Data, data)), }, ) configure_mappers() assert False except Exception: assert True clear_mappers() # currently, the "eager" relationships degrade to lazy relationships # due to the polymorphic load. # the "nxt" relationship used to have a "lazy='joined'" on it, but the # EagerLoader raises the "self-referential" # exception now. since eager loading would never work for that # relationship anyway, its better that the user # gets an exception instead of it silently not eager loading. # NOTE: using "nxt" instead of "next" to avoid 2to3 turning it into # __next__() for some reason. table1_mapper = mapper( Table1, table1, # select_table=join, polymorphic_on=table1.c.type, polymorphic_identity="table1", properties={ "nxt": relationship( Table1, backref=backref("prev", remote_side=table1.c.id, uselist=False), uselist=False, primaryjoin=table1.c.id == table1.c.related_id, ), "data": relationship(mapper(Data, data), lazy="joined", order_by=data.c.id), }, ) mapper(Table1B, inherits=table1_mapper, polymorphic_identity="table1b") mapper( Table2, table2, inherits=table1_mapper, polymorphic_identity="table2", ) mapper( Table3, table3, inherits=table1_mapper, polymorphic_identity="table3", ) configure_mappers() assert table1_mapper.primary_key == ( table1.c.id, ), table1_mapper.primary_key