From: Mike Bayer Date: Sat, 20 Nov 2010 20:30:12 +0000 (-0500) Subject: - merge metadata/schema/declarative branch, [ticket:1893] X-Git-Tag: rel_0_7b1~245 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e187cc538d6fa9fe7fff8aa939dd787c07345f33;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git - merge metadata/schema/declarative branch, [ticket:1893] --- e187cc538d6fa9fe7fff8aa939dd787c07345f33 diff --cc lib/sqlalchemy/ext/declarative.py index 8381e5ee1a,1be6142320..40abfbb292 --- a/lib/sqlalchemy/ext/declarative.py +++ b/lib/sqlalchemy/ext/declarative.py @@@ -1261,11 -1261,12 +1261,11 @@@ class DeclarativeMeta(type) class _GetColumns(object): def __init__(self, cls): self.cls = cls - def __getattr__(self, key): + def __getattr__(self, key): mapper = class_mapper(self.cls, compile=False) if mapper: - prop = mapper.get_property(key, raiseerr=False) - if prop is None: + if not mapper.has_property(key): raise exceptions.InvalidRequestError( "Class %r does not have a mapped column named %r" % (self.cls, key)) diff --cc lib/sqlalchemy/schema.py index 980025676b,cb0cde4df2..50df8b9b6b --- a/lib/sqlalchemy/schema.py +++ b/lib/sqlalchemy/schema.py @@@ -373,21 -374,40 +374,21 @@@ class Table(SchemaItem, expression.Tabl constraint._set_parent(self) - def append_ddl_listener(self, event, listener): + def append_ddl_listener(self, event_name, listener): """Append a DDL event listener to this ``Table``. - - The ``listener`` callable will be triggered when this ``Table`` is - created or dropped, either directly before or after the DDL is issued - to the database. The listener may modify the Table, but may not abort - the event itself. - :param event: - One of ``Table.ddl_events``; e.g. 'before-create', 'after-create', - 'before-drop' or 'after-drop'. - - :param listener: - A callable, invoked with three positional arguments: - - :event: - The event currently being handled - - :target: - The ``Table`` object being created or dropped - - :bind: - The ``Connection`` bueing used for DDL execution. - - Listeners are added to the Table's ``ddl_listeners`` attribute. + Deprecated. See :class:`.DDLEvents`. """ - - if event not in self.ddl_events: - raise LookupError(event) - self.ddl_listeners[event].append(listener) + + def adapt_listener(target, connection, **kw): + listener(event_name, target, connection, **kw) + + event.listen(adapt_listener, + "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,9 -1939,11 +1918,10 @@@ class MetaData(SchemaItem) ``MetaData``. """ - self.tables = {} + self.tables = util.frozendict() + self._schemas = set() self.bind = bind self.metadata = self - self.ddl_listeners = util.defaultdict(list) if reflect: if not bind: raise exc.ArgumentError(