]> git.ipfire.org Git - thirdparty/sqlalchemy/sqlalchemy.git/commitdiff
clearer error for ForeignKey cant locate parent table, [ticket:565]
authorMike Bayer <mike_mp@zzzcomputing.com>
Sun, 29 Jul 2007 02:26:42 +0000 (02:26 +0000)
committerMike Bayer <mike_mp@zzzcomputing.com>
Sun, 29 Jul 2007 02:26:42 +0000 (02:26 +0000)
lib/sqlalchemy/schema.py
test/engine/reflection.py

index 3faa3b89c715220440c09dcb951efb3e37970073..737a992f6de0affead8788f23b3ab5a03a5e4830 100644 (file)
@@ -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}
 
index 1d1ca858c0336d6d9eeb1c7ac8c166989a612a4f..73f66313539bc94d2012e3ac48503c89c27be83d 100644 (file)
@@ -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("""