params = {'table_name': table_name}
- text = \
- "SELECT"\
- "\nac.constraint_name,"\
- "\nac.constraint_type,"\
- "\nloc.column_name AS local_column,"\
- "\nrem.table_name AS remote_table,"\
- "\nrem.column_name AS remote_column,"\
- "\nrem.owner AS remote_owner,"\
- "\nloc.position as loc_pos,"\
- "\nrem.position as rem_pos,"\
- "\nac.search_condition"\
- "\nFROM all_constraints%(dblink)s ac,"\
- "\nall_cons_columns%(dblink)s loc,"\
- "\nall_cons_columns%(dblink)s rem"\
- "\nWHERE ac.table_name = :table_name"\
+ text = (
+ "SELECT"
+ "\nac.constraint_name," # 0
+ "\nac.constraint_type," # 1
+ "\nloc.column_name AS local_column," # 2
+ "\nrem.table_name AS remote_table," # 3
+ "\nrem.column_name AS remote_column," # 4
+ "\nrem.owner AS remote_owner," # 5
+ "\nloc.position as loc_pos," # 6
+ "\nrem.position as rem_pos," # 7
+ "\nac.search_condition," # 8
+ "\nac.delete_rule" # 9
+ "\nFROM all_constraints%(dblink)s ac,"
+ "\nall_cons_columns%(dblink)s loc,"
+ "\nall_cons_columns%(dblink)s rem"
+ "\nWHERE ac.table_name = :table_name"
"\nAND ac.constraint_type IN ('R','P', 'U', 'C')"
+ )
if schema is not None:
params['owner'] = schema
text += "\nAND ac.owner = :owner"
- text += \
- "\nAND ac.owner = loc.owner"\
- "\nAND ac.constraint_name = loc.constraint_name"\
- "\nAND ac.r_owner = rem.owner(+)"\
- "\nAND ac.r_constraint_name = rem.constraint_name(+)"\
- "\nAND (rem.position IS NULL or loc.position=rem.position)"\
+ text += (
+ "\nAND ac.owner = loc.owner"
+ "\nAND ac.constraint_name = loc.constraint_name"
+ "\nAND ac.r_owner = rem.owner(+)"
+ "\nAND ac.r_constraint_name = rem.constraint_name(+)"
+ "\nAND (rem.position IS NULL or loc.position=rem.position)"
"\nORDER BY ac.constraint_name, loc.position"
+ )
text = text % {'dblink': dblink}
rp = connection.execute(sql.text(text), **params)
dblink
"""
-
requested_schema = schema # to check later on
resolve_synonyms = kw.get('oracle_resolve_synonyms', False)
dblink = kw.get('dblink', '')
'constrained_columns': [],
'referred_schema': None,
'referred_table': None,
- 'referred_columns': []
+ 'referred_columns': [],
+ 'options': {},
}
fkeys = util.defaultdict(fkey_rec)
self.denormalize_name(remote_owner) != schema:
rec['referred_schema'] = remote_owner
+ if row[9] != 'NO ACTION':
+ rec['options']['ondelete'] = row[9]
+
local_cols.append(local_column)
remote_cols.append(remote_column)
def test_get_foreign_keys_with_schema(self):
self._test_get_foreign_keys(schema=testing.config.test_schema)
- @testing.requires.foreign_key_constraint_option_reflection
+ @testing.requires.foreign_key_constraint_option_reflection_ondelete
+ def test_get_foreign_key_options_ondelete(self):
+ self._test_get_foreign_key_options(ondelete="CASCADE")
+
+ @testing.requires.foreign_key_constraint_option_reflection_onupdate
+ def test_get_foreign_key_options_onupdate(self):
+ self._test_get_foreign_key_options(onupdate="SET NULL")
+
@testing.provide_metadata
- def test_get_foreign_key_options(self):
+ def _test_get_foreign_key_options(self, **options):
meta = self.metadata
Table(
sa.ForeignKeyConstraint(
['tid'], ['table.id'],
name='myfk',
- onupdate="SET NULL", ondelete="CASCADE"),
+ **options),
test_needs_fk=True)
meta.create_all()
(k, opts[k])
for k in opts if opts[k]
),
- {'onupdate': 'SET NULL', 'ondelete': 'CASCADE'}
+ options
)
def _assert_insp_indexes(self, indexes, expected_indexes):