summaryrefslogtreecommitdiff
path: root/lib/sqlalchemy/schema.py
diff options
context:
space:
mode:
Diffstat (limited to 'lib/sqlalchemy/schema.py')
-rw-r--r--lib/sqlalchemy/schema.py33
1 files changed, 24 insertions, 9 deletions
diff --git a/lib/sqlalchemy/schema.py b/lib/sqlalchemy/schema.py
index 980025676..50df8b9b6 100644
--- a/lib/sqlalchemy/schema.py
+++ b/lib/sqlalchemy/schema.py
@@ -207,12 +207,13 @@ class Table(SchemaItem, expression.TableClause):
if mustexist:
raise exc.InvalidRequestError(
"Table '%s' not defined" % (key))
- metadata.tables[key] = table = object.__new__(cls)
+ table = object.__new__(cls)
+ metadata._add_table(name, schema, table)
try:
table._init(name, metadata, *args, **kw)
return table
except:
- metadata.tables.pop(key)
+ metadata._remove_table(name, schema)
raise
def __init__(self, *args, **kw):
@@ -387,7 +388,7 @@ class Table(SchemaItem, expression.TableClause):
"on_" + event_name.replace('-', '_'), self)
def _set_parent(self, metadata):
- metadata.tables[_get_table_key(self.name, self.schema)] = self
+ metadata._add_table(self.name, self.schema, self)
self.metadata = metadata
def get_children(self, column_collections=True,
@@ -1917,7 +1918,8 @@ class MetaData(SchemaItem):
``MetaData``.
"""
- self.tables = {}
+ self.tables = util.frozendict()
+ self._schemas = set()
self.bind = bind
self.metadata = self
if reflect:
@@ -1935,6 +1937,20 @@ class MetaData(SchemaItem):
table_or_key = table_or_key.key
return table_or_key in self.tables
+ def _add_table(self, name, schema, table):
+ key = _get_table_key(name, schema)
+ dict.__setitem__(self.tables, key, table)
+ if schema:
+ self._schemas.add(schema)
+
+ def _remove_table(self, name, schema):
+ key = _get_table_key(name, schema)
+ dict.pop(self.tables, key, None)
+ if self._schemas:
+ self._schemas = set([t.schema
+ for t in self.tables.values()
+ if t.schema is not None])
+
def __getstate__(self):
return {'tables': self.tables}
@@ -1969,15 +1985,14 @@ class MetaData(SchemaItem):
def clear(self):
"""Clear all Table objects from this MetaData."""
- # TODO: why have clear()/remove() but not all
- # other accesors/mutators for the tables dict ?
- self.tables.clear()
+ dict.clear(self.tables)
+ self._schemas.clear()
+
def remove(self, table):
"""Remove the given Table object from this MetaData."""
- # TODO: scan all other tables and remove FK _column
- del self.tables[table.key]
+ self._remove_table(table.name, table.schema)
@property
def sorted_tables(self):