def _fk_colspec(fk, metadata_schema):
"""Implement a 'safe' version of ForeignKey._get_colspec() that
- never tries to resolve the remote table.
+ won't fail if the remote table can't be resolved.
"""
colspec = fk._get_colspec()
else:
table_fullname = ".".join(tokens[0:-1])
- if fk.parent is not None and fk.parent.table is not None:
- # try to resolve the remote table and adjust for column.key
+ if not fk.link_to_name and \
+ fk.parent is not None and fk.parent.table is not None:
+ # try to resolve the remote table in order to adjust for column.key.
+ # the FK constraint needs to be rendered in terms of the column
+ # name.
parent_metadata = fk.parent.table.metadata
if table_fullname in parent_metadata.tables:
- colname = _ident(
- parent_metadata.tables[table_fullname].c[colname].name)
+ col = parent_metadata.tables[table_fullname].c.get(colname)
+ if col is not None:
+ colname = _ident(col.name)
colspec = "%s.%s" % (table_fullname, colname)
"ondelete='CASCADE', initially='XYZ', deferrable=True)"
)
+ def test_render_fk_constraint_resolve_key(self):
+ m = MetaData()
+ t1 = Table('t', m, Column('c', Integer))
+ t2 = Table('t2', m, Column('c_rem', Integer, key='c_remkey'))
+
+ fk = ForeignKeyConstraint(['c'], ['t2.c_remkey'])
+ t1.append_constraint(fk)
+
+ eq_ignore_whitespace(
+ re.sub(
+ r"u'", "'",
+ autogenerate.render._render_constraint(
+ fk, self.autogen_context)),
+ "sa.ForeignKeyConstraint(['c'], ['t2.c_rem'], )"
+ )
+
+ def test_render_fk_constraint_bad_table_resolve(self):
+ m = MetaData()
+ t1 = Table('t', m, Column('c', Integer))
+ t2 = Table('t2', m, Column('c_rem', Integer))
+
+ fk = ForeignKeyConstraint(['c'], ['t2.nonexistent'])
+ t1.append_constraint(fk)
+
+ eq_ignore_whitespace(
+ re.sub(
+ r"u'", "'",
+ autogenerate.render._render_constraint(
+ fk, self.autogen_context)),
+ "sa.ForeignKeyConstraint(['c'], ['t2.nonexistent'], )"
+ )
+
+ def test_render_fk_constraint_bad_table_resolve_dont_get_confused(self):
+ m = MetaData()
+ t1 = Table('t', m, Column('c', Integer))
+ t2 = Table(
+ 't2', m,
+ Column('c_rem', Integer, key='cr_key'),
+ Column('c_rem_2', Integer, key='c_rem')
+
+ )
+
+ fk = ForeignKeyConstraint(['c'], ['t2.c_rem'], link_to_name=True)
+ t1.append_constraint(fk)
+
+ eq_ignore_whitespace(
+ re.sub(
+ r"u'", "'",
+ autogenerate.render._render_constraint(
+ fk, self.autogen_context)),
+ "sa.ForeignKeyConstraint(['c'], ['t2.c_rem'], )"
+ )
+
+ def test_render_fk_constraint_link_to_name(self):
+ m = MetaData()
+ t1 = Table('t', m, Column('c', Integer))
+ t2 = Table('t2', m, Column('c_rem', Integer, key='c_remkey'))
+
+ fk = ForeignKeyConstraint(['c'], ['t2.c_rem'], link_to_name=True)
+ t1.append_constraint(fk)
+
+ eq_ignore_whitespace(
+ re.sub(
+ r"u'", "'",
+ autogenerate.render._render_constraint(
+ fk, self.autogen_context)),
+ "sa.ForeignKeyConstraint(['c'], ['t2.c_rem'], )"
+ )
+
def test_render_fk_constraint_use_alter(self):
m = MetaData()
Table('t', m, Column('c', Integer))