From 9b1ccb29d41e17e386e7811fbfb9ed4308324805 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Sun, 29 Jul 2007 02:26:42 +0000 Subject: [PATCH] clearer error for ForeignKey cant locate parent table, [ticket:565] --- lib/sqlalchemy/schema.py | 7 ++++++- test/engine/reflection.py | 13 +++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py index 3faa3b89c7..737a992f6d 100644 --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@ -147,7 +147,7 @@ class _TableSingleton(sql._FigureVisitName): return table except KeyError: if mustexist: - raise exceptions.ArgumentError("Table '%s.%s' not defined" % (schema, name)) + raise exceptions.ArgumentError("Table '%s' not defined" % (key)) table = type.__call__(self, name, metadata, **kwargs) table._set_parent(metadata) # load column definitions from the database if 'autoload' is defined @@ -728,6 +728,8 @@ class ForeignKey(SchemaItem): schema = None else: (schema,tname,colname) = m.group(1,2,3) + if tname not in parenttable.metadata: + raise exceptions.InvalidRequestError("Could not find table '%s' with which to generate a foreign key" % tname) table = Table(tname, parenttable.metadata, mustexist=True, schema=schema) try: if colname is None: @@ -1108,6 +1110,9 @@ class MetaData(SchemaItem): def __repr__(self): return 'MetaData(%r)' % self.bind + def __contains__(self, key): + return key in self.tables + def __getstate__(self): return {'tables':self.tables, 'casesensitive':self._case_sensitive_setting} diff --git a/test/engine/reflection.py b/test/engine/reflection.py index 1d1ca858c0..73f6631353 100644 --- a/test/engine/reflection.py +++ b/test/engine/reflection.py @@ -284,6 +284,19 @@ class ReflectionTest(PersistTest): finally: testbase.db.execute("drop table book") + def test_fk_error(self): + metadata = MetaData(testbase.db) + slots_table = Table('slots', metadata, + Column('slot_id', Integer, primary_key=True), + Column('pkg_id', Integer, ForeignKey('pkgs.pkg_id')), + Column('slot', String), + ) + try: + metadata.create_all() + assert False + except exceptions.InvalidRequestError, err: + assert str(err) == "Could not find table 'pkgs' with which to generate a foreign key" + def test_composite_pks(self): """test reflection of a composite primary key""" testbase.db.execute(""" -- 2.47.3